@call-me-sensei/toonlab 0.4.21 → 0.4.23

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.
Files changed (129) hide show
  1. package/NPM-LIBRARY.md +87 -27
  2. package/README.md +11 -10
  3. package/agents/PROMPTS.md +17 -3
  4. package/agents/README.md +13 -3
  5. package/agents/claude/CLAUDE.md +3 -0
  6. package/agents/codex/AGENTS.md +112 -159
  7. package/agents/cursor/toonlab.mdc +7 -3
  8. package/agents/examples/game-foundation.mjs +104 -0
  9. package/agents/references/game-lifecycle.md +57 -0
  10. package/agents/references/runtime-entry-points.md +26 -0
  11. package/agents/references/style-bundles.md +4 -1
  12. package/agents/skills/claude/asset-sourcing/SKILL.md +7 -4
  13. package/agents/skills/claude/environment/SKILL.md +4 -0
  14. package/agents/skills/claude/game-dev/SKILL.md +63 -87
  15. package/agents/skills/claude/lighting/SKILL.md +36 -0
  16. package/agents/skills/claude/post-processing/SKILL.md +8 -3
  17. package/agents/skills/claude/rock-ground-shaders/SKILL.md +10 -15
  18. package/agents/skills/claude/rockgen/SKILL.md +52 -21
  19. package/agents/skills/claude/scene-style-application/SKILL.md +4 -0
  20. package/agents/skills/claude/style-presets/SKILL.md +11 -8
  21. package/agents/skills/claude/toon-shading/SKILL.md +4 -0
  22. package/agents/skills/claude/vegetation-sky/SKILL.md +13 -7
  23. package/agents/skills/claude/visual-verification/SKILL.md +45 -119
  24. package/agents/skills/claude/water/SKILL.md +6 -2
  25. package/agents/skills/codex/asset-sourcing/SKILL.md +7 -4
  26. package/agents/skills/codex/environment/SKILL.md +4 -0
  27. package/agents/skills/codex/game-dev/SKILL.md +63 -87
  28. package/agents/skills/codex/lighting/SKILL.md +36 -0
  29. package/agents/skills/codex/post-processing/SKILL.md +8 -3
  30. package/agents/skills/codex/rock-ground-shaders/SKILL.md +10 -15
  31. package/agents/skills/codex/rockgen/SKILL.md +52 -21
  32. package/agents/skills/codex/scene-style-application/SKILL.md +4 -0
  33. package/agents/skills/codex/style-presets/SKILL.md +11 -8
  34. package/agents/skills/codex/toon-shading/SKILL.md +4 -0
  35. package/agents/skills/codex/vegetation-sky/SKILL.md +13 -7
  36. package/agents/skills/codex/visual-verification/SKILL.md +45 -119
  37. package/agents/skills/codex/water/SKILL.md +6 -2
  38. package/database/apply-one-catalog-seed.mjs +63 -0
  39. package/database/providers.mjs +1 -0
  40. package/database/seeds/catalog/0005_2026-08-c8-first12.sql +1101 -0
  41. package/database/seeds/catalog/0006_2026-09-c8-first100.sql +14245 -0
  42. package/database/seeds/catalog/0007_2026-09-c8-first100-primary-model.sql +14845 -0
  43. package/mcp/lab-management.mjs +11 -8
  44. package/mcp/public-catalog.mjs +0 -16
  45. package/mcp/tree-lab-contract.mjs +2381 -0
  46. package/mcp/vite-plugin.mjs +5 -1
  47. package/package.json +29 -18
  48. package/src/catalog/officialCatalog.js +1 -0
  49. package/src/catalog/officialCatalogAssetRuntime.js +98 -1
  50. package/src/catalog/officialCatalogLod.js +160 -16
  51. package/src/catalog/officialCatalogPlacement.js +52 -12
  52. package/src/catalog/officialCatalogProvider.js +79 -8
  53. package/src/catalog/officialCatalogRockPackage.js +172 -0
  54. package/src/cloud/cloudReprojection.js +40 -7
  55. package/src/cloud/cloudVolume.js +44 -7
  56. package/src/cloud/noise/baseShapeVolume.js +8 -6
  57. package/src/cloud/noise/cirrusMap.js +2 -1
  58. package/src/cloud/noise/curlNoise.js +2 -1
  59. package/src/cloud/noise/erosionVolume.js +2 -1
  60. package/src/cloud/noise/textureCache.js +77 -0
  61. package/src/cloud/noise/weatherMap.js +2 -1
  62. package/src/core/sha256.js +83 -0
  63. package/src/ground-shader/groundShaderMaterial.js +12 -3
  64. package/src/rock-shader/rockMaterial.js +205 -28
  65. package/src/rock-shader/rockShaderRuntime.js +17 -1
  66. package/src/rock-shader/rockShaderSettings.js +16 -0
  67. package/src/rockgen/index.js +9 -0
  68. package/src/rockgen/lod/index.js +1 -0
  69. package/src/rockgen/lod/rockDenseFieldPolicy.js +143 -0
  70. package/src/rockgen/rockDocument.js +899 -35
  71. package/src/rockgen/surface/c7GeologySurface.js +39 -9
  72. package/src/rockgen/surface/naturalRockSurface.js +1948 -0
  73. package/src/shaders-tsl/chunks/projected-water-caustics.js +14 -2
  74. package/src/shaders-tsl/chunks/water-foam.js +6 -6
  75. package/src/shaders-tsl/chunks/water-lighting.js +28 -5
  76. package/src/shaders-tsl/chunks/water-shore-state.js +5 -2
  77. package/src/shaders-tsl/chunks/water-waves.js +10 -5
  78. package/src/shaders-tsl/flower.js +7 -4
  79. package/src/shaders-tsl/grass.js +4 -3
  80. package/src/shaders-tsl/water-shore-state-simulation.js +3 -2
  81. package/src/shaders-tsl/water.js +209 -41
  82. package/src/sky/skySystem.js +30 -7
  83. package/src/toon/settings/perspectiveRemovalSettings.js +1 -1
  84. package/src/toon/toonSettings.js +74 -0
  85. package/src/vegetation/stylizedFlower.js +6 -0
  86. package/src/version.js +1 -1
  87. package/src/water/waterDetailSpectrum.js +91 -0
  88. package/src/water/waterDynamics.js +422 -0
  89. package/src/water/waterFoamParticles.js +196 -0
  90. package/src/water/waterFoamTexture.js +57 -0
  91. package/src/water/waterHydrodynamics.js +209 -0
  92. package/src/water/waterMaterial.js +1 -0
  93. package/src/water/waterRenderExtension.js +107 -0
  94. package/src/water/waterScenePasses.js +14 -6
  95. package/src/water/waterSettings.js +53 -26
  96. package/src/water/waterShoreMaterial.js +38 -14
  97. package/src/water/waterSpectralOcean.js +137 -0
  98. package/src/water/waterStageSettings.js +19 -1
  99. package/src/water/waterSurface.js +62 -18
  100. package/src/water/waterUnderwaterAtmosphere.js +30 -3
  101. package/types/catalog/officialCatalog.d.ts +1 -0
  102. package/types/catalog/officialCatalogPlacement.d.ts +4 -0
  103. package/types/catalog/officialCatalogRockPackage.d.ts +68 -0
  104. package/types/cloud/noise/baseShapeVolume.d.ts +1 -1
  105. package/types/cloud/noise/textureCache.d.ts +12 -0
  106. package/types/core/sha256.d.ts +2 -0
  107. package/types/index.d.ts +30 -0
  108. package/types/rock-shader/rockMaterial.d.ts +3 -0
  109. package/types/rock-shader/rockShaderSettings.d.ts +2 -0
  110. package/types/rockgen/index.d.ts +1 -0
  111. package/types/rockgen/lod/index.d.ts +1 -0
  112. package/types/rockgen/lod/rockDenseFieldPolicy.d.ts +181 -0
  113. package/types/rockgen/rockDocument.d.ts +654 -71
  114. package/types/rockgen/surface/naturalRockSurface.d.ts +100 -0
  115. package/types/shaders-tsl/chunks/projected-water-caustics.d.ts +7 -1
  116. package/types/shaders-tsl/chunks/water-lighting.d.ts +4 -3
  117. package/types/shaders-tsl/water.d.ts +2 -1
  118. package/types/version.d.ts +1 -1
  119. package/types/water/waterDetailSpectrum.d.ts +13 -0
  120. package/types/water/waterDynamics.d.ts +89 -0
  121. package/types/water/waterFoamParticles.d.ts +32 -0
  122. package/types/water/waterFoamTexture.d.ts +1 -0
  123. package/types/water/waterHydrodynamics.d.ts +49 -0
  124. package/types/water/waterRenderExtension.d.ts +16 -0
  125. package/types/water/waterScenePasses.d.ts +1 -1
  126. package/types/water/waterSettings.d.ts +1 -0
  127. package/types/water/waterSpectralOcean.d.ts +17 -0
  128. package/types/water/waterStageSettings.d.ts +1 -1
  129. package/types/water/waterUnderwaterAtmosphere.d.ts +19 -4
@@ -0,0 +1,2381 @@
1
+ // Generated by scripts/sync-mcp-tree-contract.mjs.
2
+ export const treeContract = {
3
+ "starter": {
4
+ "schema": "treeRecipe",
5
+ "version": 3,
6
+ "type": "tree",
7
+ "architecture": {
8
+ "id": "legacy-woody",
9
+ "engine": "legacy-woody",
10
+ "version": 2
11
+ },
12
+ "options": {
13
+ "size": 1.7,
14
+ "seed": 3,
15
+ "canopyColor": [
16
+ 0.30196078431372547,
17
+ 0.6352941176470588,
18
+ 0.34509803921568627
19
+ ],
20
+ "canopyPalette": {},
21
+ "leafDensity": 1,
22
+ "canopy": {
23
+ "architecture": "cloud-cards",
24
+ "cardCount": 170,
25
+ "cardSizeRange": [
26
+ 1,
27
+ 1.6
28
+ ],
29
+ "cardsPerCluster": 5,
30
+ "clusterRadius": 0.48,
31
+ "frondCount": 7,
32
+ "frondLength": 1.25,
33
+ "shellFill": true,
34
+ "sprayLayers": 3,
35
+ "spraySpread": 0.8,
36
+ "sprayThickness": 0.18,
37
+ "whorlArms": 6,
38
+ "whorlRadius": 0.48
39
+ },
40
+ "vegetationShader": "call_me_sensei",
41
+ "canopyWidth": 1,
42
+ "canopyDepth": 1,
43
+ "canopyScale": 1,
44
+ "leafPlacement": "canopy",
45
+ "canopyLayout": {
46
+ "lobeCount": 6,
47
+ "spread": 1.25,
48
+ "flatten": 0.5,
49
+ "coreRadius": 0.9
50
+ },
51
+ "trunk": {
52
+ "height": 1.55,
53
+ "radiusBottom": 0.19,
54
+ "bend": 0.04,
55
+ "lean": 0.05,
56
+ "twist": 0,
57
+ "gnarl": 0,
58
+ "bendDirection": null,
59
+ "leanOffset": null
60
+ },
61
+ "skeleton": {
62
+ "generator": "limbs",
63
+ "levels": 3,
64
+ "childrenCount": 6,
65
+ "branchAngle": 55,
66
+ "branchStart": 0.4,
67
+ "lengthRatio": 0.45,
68
+ "radiusRatio": 0.7,
69
+ "gnarliness": 0.15,
70
+ "forceStrength": 0.02,
71
+ "conifer": false,
72
+ "attractionCount": 90,
73
+ "segmentLength": 0.3,
74
+ "influenceRadius": 1.2,
75
+ "killRadius": 0.42,
76
+ "maxNodes": 140,
77
+ "radialSegments": 8,
78
+ "tipRadius": 0.03,
79
+ "minLimbRadius": 0.028,
80
+ "attractionReach": null
81
+ },
82
+ "foliage": {
83
+ "windDirection": [
84
+ 0.9582438755126972,
85
+ 0.28595222510483553
86
+ ],
87
+ "windSpeed": 1,
88
+ "windStrength": 0.05
89
+ }
90
+ }
91
+ },
92
+ "fields": {
93
+ "plant": {
94
+ "type": {
95
+ "id": "plant.type",
96
+ "group": "plant",
97
+ "key": "type",
98
+ "label": "Type",
99
+ "description": "Tree (trunk + crown), bush (foliage mass on the ground), or flower (stem + branches tipped with blooms).",
100
+ "type": "select",
101
+ "control": null,
102
+ "defaultValue": "tree",
103
+ "serializable": true,
104
+ "bake": "rebuild",
105
+ "range": null,
106
+ "options": [
107
+ "tree",
108
+ "bush",
109
+ "flower"
110
+ ],
111
+ "optionLabels": {
112
+ "tree": "Tree",
113
+ "bush": "Bush / Shrub",
114
+ "flower": "Flower"
115
+ },
116
+ "optionDisabled": null
117
+ },
118
+ "seed": {
119
+ "id": "plant.seed",
120
+ "group": "plant",
121
+ "key": "seed",
122
+ "label": "Seed",
123
+ "description": "Deterministic generation seed; the same options and seed always grow the same tree. Construction-only.",
124
+ "type": "number",
125
+ "control": null,
126
+ "defaultValue": 3,
127
+ "serializable": true,
128
+ "bake": "rebuild",
129
+ "range": {
130
+ "max": 999,
131
+ "min": 1,
132
+ "step": 1
133
+ },
134
+ "options": null,
135
+ "optionLabels": null,
136
+ "optionDisabled": null
137
+ },
138
+ "size": {
139
+ "id": "plant.size",
140
+ "group": "plant",
141
+ "key": "size",
142
+ "label": "Size",
143
+ "description": "Overall tree multiplier (1 ≈ 3 m tree, 2 ≈ 6 m, 3+ large). Construction-only: also densifies canopy cards so leaves stay leaf-sized.",
144
+ "type": "number",
145
+ "control": null,
146
+ "defaultValue": 1.7,
147
+ "serializable": true,
148
+ "bake": "rebuild",
149
+ "range": {
150
+ "max": 6,
151
+ "min": 0.2,
152
+ "step": 0.05
153
+ },
154
+ "options": null,
155
+ "optionLabels": null,
156
+ "optionDisabled": null
157
+ },
158
+ "speciesProfileId": {
159
+ "id": "plant.speciesProfileId",
160
+ "group": "plant",
161
+ "key": "speciesProfileId",
162
+ "label": "Species",
163
+ "description": "A botanical species preset backed by its architecture-specific procedural engine. Experimental profiles are available for testing but remain excluded from approved catalog output.",
164
+ "type": "select",
165
+ "control": "search-select",
166
+ "defaultValue": "",
167
+ "serializable": true,
168
+ "bake": "rebuild",
169
+ "range": null,
170
+ "options": [
171
+ "",
172
+ "adansonia-digitata",
173
+ "elaeis-guineensis",
174
+ "ulmus-americana",
175
+ "liquidambar-styraciflua",
176
+ "malus-domestica",
177
+ "areca-catechu",
178
+ "pyrus-pyrifolia",
179
+ "rhizophora-apiculata",
180
+ "betula-platyphylla",
181
+ "sphaeropteris-cooperi",
182
+ "taxodium-distichum",
183
+ "ficus-benghalensis",
184
+ "laurus-nobilis",
185
+ "swietenia-macrophylla",
186
+ "phyllostachys-bissetii",
187
+ "alnus-glutinosa",
188
+ "phyllostachys-nigra",
189
+ "populus-nigra",
190
+ "sphaeropteris-medullaris",
191
+ "eucalyptus-globulus",
192
+ "melaleuca-quinquenervia",
193
+ "podocarpus-macrophyllus",
194
+ "macrozamia-communis",
195
+ "sabal-palmetto",
196
+ "cordyline-australis",
197
+ "dracaena-draco",
198
+ "ceratonia-siliqua",
199
+ "cedrus-libani",
200
+ "dioon-edule",
201
+ "ficus-microcarpa",
202
+ "ulmus-parvifolia",
203
+ "livistona-chinensis",
204
+ "juniperus-chinensis",
205
+ "cercis-chinensis",
206
+ "glyptostrobus-pensilis",
207
+ "sequoia-sempervirens",
208
+ "cocos-nucifera",
209
+ "bambusa-vulgaris",
210
+ "celtis-occidentalis",
211
+ "quercus-suber",
212
+ "phoenix-dactylifera",
213
+ "metasequoia-glyptostroboides",
214
+ "cedrus-deodara",
215
+ "pseudotsuga-menziesii",
216
+ "hyphaene-thebaica",
217
+ "encephalartos-altensteinii",
218
+ "populus-deltoides",
219
+ "pinus-strobus",
220
+ "paulownia-tomentosa",
221
+ "quercus-robur",
222
+ "juglans-regia",
223
+ "ensete-ventricosum",
224
+ "populus-tremula",
225
+ "fraxinus-excelsior",
226
+ "fagus-sylvatica",
227
+ "carpinus-betulus",
228
+ "larix-decidua",
229
+ "prunus-domestica",
230
+ "abies-alba",
231
+ "picea-jezoensis",
232
+ "acer-japonicum",
233
+ "corymbia-aparrerinja",
234
+ "dendrocalamus-asper",
235
+ "strelitzia-nicolai",
236
+ "pachycereus-pringlei",
237
+ "sequoiadendron-giganteum",
238
+ "bambusa-oldhamii",
239
+ "ginkgo-biloba",
240
+ "phyllostachys-aurea",
241
+ "dypsis-lutescens",
242
+ "adansonia-grandidieri",
243
+ "pinus-longaeva",
244
+ "avicennia-marina",
245
+ "guadua-angustifolia",
246
+ "senegalia-senegal",
247
+ "dipterocarpus-alatus",
248
+ "cibotium-glaucum",
249
+ "chamaecyparis-obtusa",
250
+ "quercus-ilex",
251
+ "cupressus-sempervirens",
252
+ "jacaranda-mimosifolia",
253
+ "alnus-japonica",
254
+ "prunus-mume",
255
+ "fagus-crenata",
256
+ "pinus-thunbergii",
257
+ "cryptomeria-japonica",
258
+ "prunus-serrulata",
259
+ "carpinus-japonica",
260
+ "larix-kaempferi",
261
+ "acer-palmatum",
262
+ "diospyros-kaki",
263
+ "pinus-densiflora",
264
+ "phyllostachys-bambusoides",
265
+ "pinus-parviflora",
266
+ "zelkova-serrata",
267
+ "yucca-brevifolia",
268
+ "ceiba-pentandra",
269
+ "magnolia-kobus",
270
+ "cornus-kousa",
271
+ "rhapis-excelsa",
272
+ "bruguiera-gymnorhiza",
273
+ "pinus-contorta",
274
+ "pinus-palustris",
275
+ "fraxinus-mandshurica",
276
+ "mangifera-indica",
277
+ "sclerocarya-birrea",
278
+ "chamaerops-humilis",
279
+ "washingtonia-robusta",
280
+ "abies-firma",
281
+ "araucaria-araucana",
282
+ "ficus-macrophylla",
283
+ "phyllostachys-edulis",
284
+ "agathis-australis",
285
+ "nypa-fruticans",
286
+ "araucaria-heterophylla",
287
+ "quercus-rubra",
288
+ "picea-abies",
289
+ "olea-europaea",
290
+ "stenocereus-thurberi",
291
+ "borassus-flabellifer",
292
+ "betula-papyrifera",
293
+ "acer-griseum",
294
+ "prunus-persica",
295
+ "cereus-repandus",
296
+ "pinus-ponderosa",
297
+ "opuntia-ficus-indica",
298
+ "populus-tremuloides",
299
+ "cycas-circinalis",
300
+ "aloidendron-dichotomum",
301
+ "samanea-saman",
302
+ "eucalyptus-deglupta",
303
+ "rhizophora-mangle",
304
+ "acer-rubrum",
305
+ "eucalyptus-camaldulensis",
306
+ "fargesia-robusta",
307
+ "roystonea-regia",
308
+ "delonix-regia",
309
+ "ficus-elastica",
310
+ "ficus-religiosa",
311
+ "cycas-revoluta",
312
+ "carnegiea-gigantea",
313
+ "shorea-robusta",
314
+ "pinus-sylvestris",
315
+ "pandanus-tectorius",
316
+ "betula-pendula",
317
+ "alsophila-dealbata",
318
+ "tilia-cordata",
319
+ "dracaena-cinnabari",
320
+ "dicksonia-antarctica",
321
+ "pinus-pinea",
322
+ "arbutus-unedo",
323
+ "acer-saccharum",
324
+ "castanea-sativa",
325
+ "tamarindus-indica",
326
+ "ravenala-madagascariensis",
327
+ "koompassia-excelsa",
328
+ "liriodendron-tulipifera",
329
+ "vachellia-tortilis",
330
+ "thuja-plicata",
331
+ "salix-alba",
332
+ "sonneratia-alba",
333
+ "musa-acuminata",
334
+ "trachycarpus-fortunei",
335
+ "wollemia-nobilis",
336
+ "ulmus-glabra"
337
+ ],
338
+ "optionLabels": {
339
+ "": "Classic / custom tree",
340
+ "adansonia-digitata": "African baobab — Adansonia digitata (experimental)",
341
+ "elaeis-guineensis": "African oil palm — Elaeis guineensis (experimental)",
342
+ "ulmus-americana": "American elm — Ulmus americana (experimental)",
343
+ "liquidambar-styraciflua": "American sweetgum — Liquidambar styraciflua (experimental)",
344
+ "malus-domestica": "Apple — Malus domestica (experimental)",
345
+ "areca-catechu": "Areca palm — Areca catechu (experimental)",
346
+ "pyrus-pyrifolia": "Asian pear — Pyrus pyrifolia (experimental)",
347
+ "rhizophora-apiculata": "Asian red mangrove — Rhizophora apiculata (experimental)",
348
+ "betula-platyphylla": "Asian white birch — Betula pendula subsp. mandshurica (experimental)",
349
+ "sphaeropteris-cooperi": "Australian tree fern — Sphaeropteris cooperi (experimental)",
350
+ "taxodium-distichum": "Bald cypress — Taxodium distichum (experimental)",
351
+ "ficus-benghalensis": "Banyan — Ficus benghalensis (experimental)",
352
+ "laurus-nobilis": "Bay laurel — Laurus nobilis (experimental)",
353
+ "swietenia-macrophylla": "Big-leaf mahogany — Swietenia macrophylla (experimental)",
354
+ "phyllostachys-bissetii": "Bisset bamboo — Phyllostachys bissetii (experimental)",
355
+ "alnus-glutinosa": "Black alder — Alnus glutinosa (experimental)",
356
+ "phyllostachys-nigra": "Black bamboo — Phyllostachys nigra (experimental)",
357
+ "populus-nigra": "Black poplar — Populus nigra (experimental)",
358
+ "sphaeropteris-medullaris": "Black tree fern — Sphaeropteris medullaris (experimental)",
359
+ "eucalyptus-globulus": "Blue gum — Eucalyptus globulus (experimental)",
360
+ "melaleuca-quinquenervia": "Broad-leaved paperbark — Melaleuca quinquenervia (experimental)",
361
+ "podocarpus-macrophyllus": "Buddhist pine — Podocarpus macrophyllus (experimental)",
362
+ "macrozamia-communis": "Burrawang — Macrozamia communis (experimental)",
363
+ "sabal-palmetto": "Cabbage palm — Sabal palmetto (experimental)",
364
+ "cordyline-australis": "Cabbage tree — Cordyline australis (experimental)",
365
+ "dracaena-draco": "Canary Islands dragon tree — Dracaena draco (experimental)",
366
+ "ceratonia-siliqua": "Carob — Ceratonia siliqua (experimental)",
367
+ "cedrus-libani": "Cedar of Lebanon — Cedrus libani (experimental)",
368
+ "dioon-edule": "Chestnut dioon — Dioon edule (experimental)",
369
+ "ficus-microcarpa": "Chinese banyan — Ficus microcarpa (experimental)",
370
+ "ulmus-parvifolia": "Chinese elm — Ulmus parvifolia (experimental)",
371
+ "livistona-chinensis": "Chinese fan palm — Livistona chinensis (experimental)",
372
+ "juniperus-chinensis": "Chinese juniper — Juniperus chinensis (experimental)",
373
+ "cercis-chinensis": "Chinese redbud — Cercis chinensis (experimental)",
374
+ "glyptostrobus-pensilis": "Chinese swamp cypress — Glyptostrobus pensilis (experimental)",
375
+ "sequoia-sempervirens": "Coast redwood — Sequoia sempervirens (experimental)",
376
+ "cocos-nucifera": "Coconut — Cocos nucifera (experimental)",
377
+ "bambusa-vulgaris": "Common bamboo — Bambusa vulgaris (experimental)",
378
+ "celtis-occidentalis": "Common hackberry — Celtis occidentalis (experimental)",
379
+ "quercus-suber": "Cork oak — Quercus suber (experimental)",
380
+ "phoenix-dactylifera": "Date palm — Phoenix dactylifera (experimental)",
381
+ "metasequoia-glyptostroboides": "Dawn redwood — Metasequoia glyptostroboides (experimental)",
382
+ "cedrus-deodara": "Deodar cedar — Cedrus deodara (experimental)",
383
+ "pseudotsuga-menziesii": "Douglas fir — Pseudotsuga menziesii (experimental)",
384
+ "hyphaene-thebaica": "Doum palm — Hyphaene thebaica (experimental)",
385
+ "encephalartos-altensteinii": "Eastern Cape giant cycad — Encephalartos altensteinii (experimental)",
386
+ "populus-deltoides": "Eastern cottonwood — Populus deltoides (experimental)",
387
+ "pinus-strobus": "Eastern white pine — Pinus strobus (experimental)",
388
+ "paulownia-tomentosa": "Empress tree — Paulownia tomentosa (experimental)",
389
+ "quercus-robur": "English oak — Quercus robur (experimental)",
390
+ "juglans-regia": "English walnut — Juglans regia (experimental)",
391
+ "ensete-ventricosum": "Ethiopian banana — Ensete ventricosum (experimental)",
392
+ "populus-tremula": "Eurasian aspen — Populus tremula (experimental)",
393
+ "fraxinus-excelsior": "European ash — Fraxinus excelsior (experimental)",
394
+ "fagus-sylvatica": "European beech — Fagus sylvatica (experimental)",
395
+ "carpinus-betulus": "European hornbeam — Carpinus betulus (experimental)",
396
+ "larix-decidua": "European larch — Larix decidua (experimental)",
397
+ "prunus-domestica": "European plum — Prunus domestica (experimental)",
398
+ "abies-alba": "European silver fir — Abies alba (experimental)",
399
+ "picea-jezoensis": "Ezo spruce — Picea jezoensis (experimental)",
400
+ "acer-japonicum": "Fullmoon maple — Acer japonicum (experimental)",
401
+ "corymbia-aparrerinja": "Ghost gum — Corymbia aparrerinja (experimental)",
402
+ "dendrocalamus-asper": "Giant bamboo — Dendrocalamus asper (experimental)",
403
+ "strelitzia-nicolai": "Giant bird-of-paradise — Strelitzia nicolai (experimental)",
404
+ "pachycereus-pringlei": "Giant cardon — Pachycereus pringlei (experimental)",
405
+ "sequoiadendron-giganteum": "Giant sequoia — Sequoiadendron giganteum (experimental)",
406
+ "bambusa-oldhamii": "Giant timber bamboo — Bambusa oldhamii (experimental)",
407
+ "ginkgo-biloba": "Ginkgo — Ginkgo biloba (experimental)",
408
+ "phyllostachys-aurea": "Golden bamboo — Phyllostachys aurea (experimental)",
409
+ "dypsis-lutescens": "Golden cane palm — Chrysalidocarpus lutescens (experimental)",
410
+ "adansonia-grandidieri": "Grandidier's baobab — Adansonia grandidieri (experimental)",
411
+ "pinus-longaeva": "Great Basin bristlecone pine — Pinus longaeva (experimental)",
412
+ "avicennia-marina": "Grey mangrove — Avicennia marina (experimental)",
413
+ "guadua-angustifolia": "Guadua bamboo — Guadua angustifolia (experimental)",
414
+ "senegalia-senegal": "Gum arabic tree — Senegalia senegal (experimental)",
415
+ "dipterocarpus-alatus": "Gurjan — Dipterocarpus alatus (experimental)",
416
+ "cibotium-glaucum": "Hapuu — Cibotium glaucum (experimental)",
417
+ "chamaecyparis-obtusa": "Hinoki cypress — Chamaecyparis obtusa (experimental)",
418
+ "quercus-ilex": "Holm oak — Quercus ilex (experimental)",
419
+ "cupressus-sempervirens": "Italian cypress — Cupressus sempervirens (experimental)",
420
+ "jacaranda-mimosifolia": "Jacaranda — Jacaranda mimosifolia (experimental)",
421
+ "alnus-japonica": "Japanese alder — Alnus japonica (experimental)",
422
+ "prunus-mume": "Japanese apricot — Prunus mume (experimental)",
423
+ "fagus-crenata": "Japanese beech — Fagus crenata (experimental)",
424
+ "pinus-thunbergii": "Japanese black pine — Pinus thunbergii (experimental)",
425
+ "cryptomeria-japonica": "Japanese cedar — Cryptomeria japonica (experimental)",
426
+ "prunus-serrulata": "Japanese flowering cherry — Prunus serrulata (experimental)",
427
+ "carpinus-japonica": "Japanese hornbeam — Carpinus japonica (experimental)",
428
+ "larix-kaempferi": "Japanese larch — Larix kaempferi (experimental)",
429
+ "acer-palmatum": "Japanese maple — Acer palmatum (experimental)",
430
+ "diospyros-kaki": "Japanese persimmon — Diospyros kaki (experimental)",
431
+ "pinus-densiflora": "Japanese red pine — Pinus densiflora (experimental)",
432
+ "phyllostachys-bambusoides": "Japanese timber bamboo — Phyllostachys reticulata (experimental)",
433
+ "pinus-parviflora": "Japanese white pine — Pinus parviflora (experimental)",
434
+ "zelkova-serrata": "Japanese zelkova — Zelkova serrata (experimental)",
435
+ "yucca-brevifolia": "Joshua tree — Yucca brevifolia (experimental)",
436
+ "ceiba-pentandra": "Kapok — Ceiba pentandra (experimental)",
437
+ "magnolia-kobus": "Kobus magnolia — Magnolia kobus (experimental)",
438
+ "cornus-kousa": "Kousa dogwood — Cornus kousa (experimental)",
439
+ "rhapis-excelsa": "Lady palm — Rhapis excelsa (experimental)",
440
+ "bruguiera-gymnorhiza": "Large-leafed mangrove — Bruguiera gymnorhiza (experimental)",
441
+ "pinus-contorta": "Lodgepole pine — Pinus contorta (experimental)",
442
+ "pinus-palustris": "Longleaf pine — Pinus palustris (experimental)",
443
+ "fraxinus-mandshurica": "Manchurian ash — Fraxinus mandshurica (experimental)",
444
+ "mangifera-indica": "Mango — Mangifera indica (experimental)",
445
+ "sclerocarya-birrea": "Marula — Sclerocarya birrea (experimental)",
446
+ "chamaerops-humilis": "Mediterranean fan palm — Chamaerops humilis (experimental)",
447
+ "washingtonia-robusta": "Mexican fan palm — Washingtonia filifera var. robusta (experimental)",
448
+ "abies-firma": "Momi fir — Abies firma (experimental)",
449
+ "araucaria-araucana": "Monkey puzzle — Araucaria araucana (experimental)",
450
+ "ficus-macrophylla": "Moreton Bay fig — Ficus macrophylla (experimental)",
451
+ "phyllostachys-edulis": "Moso bamboo — Phyllostachys edulis (experimental)",
452
+ "agathis-australis": "New Zealand kauri — Agathis australis (experimental)",
453
+ "nypa-fruticans": "Nipa palm — Nypa fruticans (experimental)",
454
+ "araucaria-heterophylla": "Norfolk Island pine — Araucaria heterophylla (experimental)",
455
+ "quercus-rubra": "Northern red oak — Quercus rubra (experimental)",
456
+ "picea-abies": "Norway spruce — Picea abies (experimental)",
457
+ "olea-europaea": "Olive — Olea europaea (experimental)",
458
+ "stenocereus-thurberi": "Organ-pipe cactus — Stenocereus thurberi (experimental)",
459
+ "borassus-flabellifer": "Palmyra palm — Borassus flabellifer (experimental)",
460
+ "betula-papyrifera": "Paper birch — Betula papyrifera (experimental)",
461
+ "acer-griseum": "Paperbark maple — Acer griseum (experimental)",
462
+ "prunus-persica": "Peach — Prunus persica (experimental)",
463
+ "cereus-repandus": "Peruvian apple cactus — Cereus repandus (experimental)",
464
+ "pinus-ponderosa": "Ponderosa pine — Pinus ponderosa (experimental)",
465
+ "opuntia-ficus-indica": "Prickly pear — Opuntia ficus-indica (experimental)",
466
+ "populus-tremuloides": "Quaking aspen — Populus tremuloides (experimental)",
467
+ "cycas-circinalis": "Queen sago — Cycas circinalis (experimental)",
468
+ "aloidendron-dichotomum": "Quiver tree — Aloidendron dichotomum (experimental)",
469
+ "samanea-saman": "Rain tree — Samanea saman (experimental)",
470
+ "eucalyptus-deglupta": "Rainbow eucalyptus — Eucalyptus deglupta (experimental)",
471
+ "rhizophora-mangle": "Red mangrove — Rhizophora mangle (experimental)",
472
+ "acer-rubrum": "Red maple — Acer rubrum (experimental)",
473
+ "eucalyptus-camaldulensis": "River red gum — Eucalyptus camaldulensis (experimental)",
474
+ "fargesia-robusta": "Robust fountain bamboo — Fargesia robusta (experimental)",
475
+ "roystonea-regia": "Royal palm — Roystonea regia (experimental)",
476
+ "delonix-regia": "Royal poinciana — Delonix regia (experimental)",
477
+ "ficus-elastica": "Rubber fig — Ficus elastica (experimental)",
478
+ "ficus-religiosa": "Sacred fig — Ficus religiosa (experimental)",
479
+ "cycas-revoluta": "Sago cycad — Cycas revoluta (experimental)",
480
+ "carnegiea-gigantea": "Saguaro — Carnegiea gigantea (experimental)",
481
+ "shorea-robusta": "Sal — Shorea robusta (experimental)",
482
+ "pinus-sylvestris": "Scots pine — Pinus sylvestris (experimental)",
483
+ "pandanus-tectorius": "Screw pine — Pandanus tectorius (experimental)",
484
+ "betula-pendula": "Silver birch — Betula pendula (experimental)",
485
+ "alsophila-dealbata": "Silver fern — Alsophila dealbata (experimental)",
486
+ "tilia-cordata": "Small-leaved lime — Tilia cordata (experimental)",
487
+ "dracaena-cinnabari": "Socotra dragon tree — Dracaena cinnabari (experimental)",
488
+ "dicksonia-antarctica": "Soft tree fern — Dicksonia antarctica (experimental)",
489
+ "pinus-pinea": "Stone pine — Pinus pinea (experimental)",
490
+ "arbutus-unedo": "Strawberry tree — Arbutus unedo (experimental)",
491
+ "acer-saccharum": "Sugar maple — Acer saccharum (experimental)",
492
+ "castanea-sativa": "Sweet chestnut — Castanea sativa (experimental)",
493
+ "tamarindus-indica": "Tamarind — Tamarindus indica (experimental)",
494
+ "ravenala-madagascariensis": "Traveller's tree — Ravenala madagascariensis (experimental)",
495
+ "koompassia-excelsa": "Tualang — Koompassia excelsa (experimental)",
496
+ "liriodendron-tulipifera": "Tulip tree — Liriodendron tulipifera (experimental)",
497
+ "vachellia-tortilis": "Umbrella thorn — Vachellia tortilis (experimental)",
498
+ "thuja-plicata": "Western red cedar — Thuja plicata (experimental)",
499
+ "salix-alba": "White willow — Salix alba (experimental)",
500
+ "sonneratia-alba": "White-flowered mangrove apple — Sonneratia alba (experimental)",
501
+ "musa-acuminata": "Wild banana — Musa acuminata (experimental)",
502
+ "trachycarpus-fortunei": "Windmill palm — Trachycarpus fortunei (experimental)",
503
+ "wollemia-nobilis": "Wollemi pine — Wollemia nobilis (experimental)",
504
+ "ulmus-glabra": "Wych elm — Ulmus glabra (experimental)"
505
+ },
506
+ "optionDisabled": null
507
+ },
508
+ "lifeStageSlot": {
509
+ "id": "plant.lifeStageSlot",
510
+ "group": "plant",
511
+ "key": "lifeStageSlot",
512
+ "label": "Life stage",
513
+ "description": "A named checkpoint for the selected species; choosing one also positions the growth slider.",
514
+ "type": "select",
515
+ "control": null,
516
+ "defaultValue": "mature",
517
+ "serializable": true,
518
+ "bake": "rebuild",
519
+ "range": null,
520
+ "options": [
521
+ "juvenile",
522
+ "young",
523
+ "mature",
524
+ "old",
525
+ "ancient",
526
+ "shoot",
527
+ "juvenile-culm",
528
+ "mature-culm",
529
+ "established-clump",
530
+ "mixed-age-grove",
531
+ "juvenile-rosette",
532
+ "trunk-forming",
533
+ "young-trunk",
534
+ "juvenile-clump",
535
+ "mature-clump",
536
+ "old-clump",
537
+ "mixed-age-colony",
538
+ "unbranched-trunk",
539
+ "first-branching",
540
+ "mature-multi-head",
541
+ "old-multi-head",
542
+ "young-pseudostem",
543
+ "sucker-clump",
544
+ "column-forming",
545
+ "first-branch",
546
+ "old-multi-arm"
547
+ ],
548
+ "optionLabels": null,
549
+ "optionDisabled": null
550
+ },
551
+ "developmentProgress": {
552
+ "id": "plant.developmentProgress",
553
+ "group": "plant",
554
+ "key": "developmentProgress",
555
+ "label": "Growth / age",
556
+ "description": "Continuously grow the same individual from its youngest to oldest supported form.",
557
+ "type": "number",
558
+ "control": null,
559
+ "defaultValue": 0.5,
560
+ "serializable": true,
561
+ "bake": "rebuild",
562
+ "range": {
563
+ "min": 0,
564
+ "max": 1,
565
+ "step": 0.01
566
+ },
567
+ "options": null,
568
+ "optionLabels": null,
569
+ "optionDisabled": null
570
+ },
571
+ "foliageState": {
572
+ "id": "plant.foliageState",
573
+ "group": "plant",
574
+ "key": "foliageState",
575
+ "label": "Foliage state",
576
+ "description": "Biologically valid seasonal appearance for the selected species.",
577
+ "type": "select",
578
+ "control": null,
579
+ "defaultValue": "leaf-on",
580
+ "serializable": true,
581
+ "bake": "rebuild",
582
+ "range": null,
583
+ "options": [
584
+ "leaf-on",
585
+ "autumn",
586
+ "dormant",
587
+ "dry",
588
+ "wet",
589
+ "snow",
590
+ "green"
591
+ ],
592
+ "optionLabels": null,
593
+ "optionDisabled": null
594
+ },
595
+ "stylePreset": {
596
+ "id": "plant.stylePreset",
597
+ "group": "plant",
598
+ "key": "stylePreset",
599
+ "label": "Art style",
600
+ "description": "The vegetation shading language used consistently by trunks, culms, fronds, needles, and leaves.",
601
+ "type": "select",
602
+ "control": null,
603
+ "defaultValue": "call_me_sensei",
604
+ "serializable": true,
605
+ "bake": "rebuild",
606
+ "range": null,
607
+ "options": [
608
+ "call_me_sensei",
609
+ "default"
610
+ ],
611
+ "optionLabels": {
612
+ "call_me_sensei": "Call Me Sensei",
613
+ "default": "Neutral toon"
614
+ },
615
+ "optionDisabled": null
616
+ },
617
+ "growthForm": {
618
+ "id": "plant.growthForm",
619
+ "group": "plant",
620
+ "key": "growthForm",
621
+ "label": "Growth / training form",
622
+ "description": "A structural transform applied after species and biological age. Bonsai and cultivated forms never change the botanical identity.",
623
+ "type": "select",
624
+ "control": null,
625
+ "defaultValue": "natural",
626
+ "serializable": true,
627
+ "bake": "rebuild",
628
+ "range": null,
629
+ "options": [
630
+ "natural",
631
+ "multi-stem",
632
+ "columnar",
633
+ "weeping",
634
+ "pollarded",
635
+ "coppiced",
636
+ "bonsai",
637
+ "topiary"
638
+ ],
639
+ "optionLabels": {
640
+ "natural": "Natural / species default",
641
+ "multi-stem": "Multi-stem",
642
+ "columnar": "Columnar",
643
+ "weeping": "Weeping",
644
+ "pollarded": "Pollarded",
645
+ "coppiced": "Coppiced",
646
+ "bonsai": "Bonsai",
647
+ "topiary": "Topiary"
648
+ },
649
+ "optionDisabled": null
650
+ },
651
+ "growthFormSubtype": {
652
+ "id": "plant.growthFormSubtype",
653
+ "group": "plant",
654
+ "key": "growthFormSubtype",
655
+ "label": "Form subtype",
656
+ "description": "Training-system subtype. The available choices follow the selected growth form.",
657
+ "type": "select",
658
+ "control": null,
659
+ "defaultValue": "species-default",
660
+ "serializable": true,
661
+ "bake": "rebuild",
662
+ "range": null,
663
+ "options": [
664
+ "species-default",
665
+ "clump",
666
+ "narrow-upright",
667
+ "pendant-crown",
668
+ "pollard-head",
669
+ "stool",
670
+ "formal-upright",
671
+ "informal-upright",
672
+ "slanting",
673
+ "cascade",
674
+ "semi-cascade",
675
+ "windswept",
676
+ "broom",
677
+ "literati",
678
+ "clump-forest",
679
+ "sphere",
680
+ "cone",
681
+ "cloud"
682
+ ],
683
+ "optionLabels": null,
684
+ "optionDisabled": null
685
+ }
686
+ },
687
+ "structure": {
688
+ "engine": {
689
+ "id": "structure.engine",
690
+ "group": "structure",
691
+ "key": "engine",
692
+ "label": "Architecture engine",
693
+ "description": "The structural generator selected by the species profile.",
694
+ "type": "select",
695
+ "control": null,
696
+ "defaultValue": "legacy-woody",
697
+ "serializable": true,
698
+ "bake": "rebuild",
699
+ "range": null,
700
+ "options": [
701
+ "legacy-woody",
702
+ "branch-tree",
703
+ "woody-axis",
704
+ "whorled-conifer",
705
+ "culm-colony",
706
+ "terminal-crown",
707
+ "branched-rosette",
708
+ "pseudostem-fan",
709
+ "succulent-axis"
710
+ ],
711
+ "optionLabels": null,
712
+ "optionDisabled": null
713
+ },
714
+ "crownMode": {
715
+ "id": "structure.crownMode",
716
+ "group": "structure",
717
+ "key": "crownMode",
718
+ "label": "Crown growth mode",
719
+ "description": "Leader and crown-envelope behavior for recursive woody trees.",
720
+ "type": "select",
721
+ "control": null,
722
+ "defaultValue": "decurrent",
723
+ "serializable": true,
724
+ "bake": "rebuild",
725
+ "range": null,
726
+ "options": [
727
+ "monopodial",
728
+ "excurrent",
729
+ "sparse-excurrent",
730
+ "decurrent",
731
+ "sympodial",
732
+ "vase",
733
+ "layered",
734
+ "columnar",
735
+ "weeping",
736
+ "spreading",
737
+ "umbrella",
738
+ "colonized"
739
+ ],
740
+ "optionLabels": null,
741
+ "optionDisabled": null
742
+ },
743
+ "stemCount": {
744
+ "id": "structure.stemCount",
745
+ "group": "structure",
746
+ "key": "stemCount",
747
+ "label": "Stems / culms",
748
+ "description": "Colony stem count for bamboo, clustering palms, and giant monocots.",
749
+ "type": "number",
750
+ "control": null,
751
+ "defaultValue": 1,
752
+ "serializable": true,
753
+ "bake": "rebuild",
754
+ "range": {
755
+ "min": 1,
756
+ "max": 24,
757
+ "step": 1
758
+ },
759
+ "options": null,
760
+ "optionLabels": null,
761
+ "optionDisabled": null
762
+ },
763
+ "nodeCount": {
764
+ "id": "structure.nodeCount",
765
+ "group": "structure",
766
+ "key": "nodeCount",
767
+ "label": "Culm nodes",
768
+ "description": "Node and internode count along each bamboo culm.",
769
+ "type": "number",
770
+ "control": null,
771
+ "defaultValue": 18,
772
+ "serializable": true,
773
+ "bake": "rebuild",
774
+ "range": {
775
+ "min": 4,
776
+ "max": 36,
777
+ "step": 1
778
+ },
779
+ "options": null,
780
+ "optionLabels": null,
781
+ "optionDisabled": null
782
+ },
783
+ "armCount": {
784
+ "id": "structure.armCount",
785
+ "group": "structure",
786
+ "key": "armCount",
787
+ "label": "Arms / heads",
788
+ "description": "Mature arm count for cacti or terminal-head count for branched rosettes.",
789
+ "type": "number",
790
+ "control": null,
791
+ "defaultValue": 4,
792
+ "serializable": true,
793
+ "bake": "rebuild",
794
+ "range": {
795
+ "min": 1,
796
+ "max": 16,
797
+ "step": 1
798
+ },
799
+ "options": null,
800
+ "optionLabels": null,
801
+ "optionDisabled": null
802
+ },
803
+ "whorlSize": {
804
+ "id": "structure.whorlSize",
805
+ "group": "structure",
806
+ "key": "whorlSize",
807
+ "label": "Branches per whorl",
808
+ "description": "One gives spiral phyllotaxis; larger values initiate evenly spaced branches at the same internode.",
809
+ "type": "number",
810
+ "control": null,
811
+ "defaultValue": 1,
812
+ "serializable": true,
813
+ "bake": "rebuild",
814
+ "range": {
815
+ "min": 1,
816
+ "max": 8,
817
+ "step": 1
818
+ },
819
+ "options": null,
820
+ "optionLabels": null,
821
+ "optionDisabled": null
822
+ }
823
+ },
824
+ "trunk": {
825
+ "style": {
826
+ "id": "trunk.style",
827
+ "group": "trunk",
828
+ "key": "style",
829
+ "label": "Style",
830
+ "description": "Ready-made trunk personality; editing any slider below switches to Custom.",
831
+ "type": "select",
832
+ "control": null,
833
+ "defaultValue": "straight",
834
+ "serializable": true,
835
+ "bake": "rebuild",
836
+ "range": null,
837
+ "options": [
838
+ "straight",
839
+ "leaning",
840
+ "curved",
841
+ "gnarled",
842
+ "bonsai",
843
+ "swooping",
844
+ "custom"
845
+ ],
846
+ "optionLabels": {
847
+ "straight": "Straight",
848
+ "leaning": "Leaning",
849
+ "curved": "Curved",
850
+ "gnarled": "Gnarled",
851
+ "bonsai": "Bonsai",
852
+ "swooping": "Swooping (Liyue)",
853
+ "custom": "Custom"
854
+ },
855
+ "optionDisabled": null
856
+ },
857
+ "height": {
858
+ "id": "trunk.height",
859
+ "group": "trunk",
860
+ "key": "height",
861
+ "label": "Height",
862
+ "description": "Trunk height in meters (before the overall size multiplier). Construction-only.",
863
+ "type": "number",
864
+ "control": null,
865
+ "defaultValue": 1.55,
866
+ "serializable": true,
867
+ "bake": "rebuild",
868
+ "range": {
869
+ "max": 3,
870
+ "min": 0.4,
871
+ "step": 0.05
872
+ },
873
+ "options": null,
874
+ "optionLabels": null,
875
+ "optionDisabled": null
876
+ },
877
+ "radiusBottom": {
878
+ "id": "trunk.radiusBottom",
879
+ "group": "trunk",
880
+ "key": "radiusBottom",
881
+ "label": "Radius Bottom",
882
+ "description": "Trunk radius at the root flare in meters. Construction-only.",
883
+ "type": "number",
884
+ "control": null,
885
+ "defaultValue": 0.19,
886
+ "serializable": true,
887
+ "bake": "rebuild",
888
+ "range": {
889
+ "max": 0.6,
890
+ "min": 0.05,
891
+ "step": 0.005
892
+ },
893
+ "options": null,
894
+ "optionLabels": null,
895
+ "optionDisabled": null
896
+ },
897
+ "bend": {
898
+ "id": "trunk.bend",
899
+ "group": "trunk",
900
+ "key": "bend",
901
+ "label": "Bend",
902
+ "description": "Mid-trunk bow amplitude that returns toward center (S-curve) in meters. Construction-only.",
903
+ "type": "number",
904
+ "control": null,
905
+ "defaultValue": 0.04,
906
+ "serializable": true,
907
+ "bake": "rebuild",
908
+ "range": {
909
+ "max": 0.8,
910
+ "min": 0,
911
+ "step": 0.01
912
+ },
913
+ "options": null,
914
+ "optionLabels": null,
915
+ "optionDisabled": null
916
+ },
917
+ "lean": {
918
+ "id": "trunk.lean",
919
+ "group": "trunk",
920
+ "key": "lean",
921
+ "label": "Lean",
922
+ "description": "Off-vertical drift that accumulates toward the top, in meters. Construction-only.",
923
+ "type": "number",
924
+ "control": null,
925
+ "defaultValue": 0.05,
926
+ "serializable": true,
927
+ "bake": "rebuild",
928
+ "range": {
929
+ "max": 1.2,
930
+ "min": 0,
931
+ "step": 0.01
932
+ },
933
+ "options": null,
934
+ "optionLabels": null,
935
+ "optionDisabled": null
936
+ },
937
+ "twist": {
938
+ "id": "trunk.twist",
939
+ "group": "trunk",
940
+ "key": "twist",
941
+ "label": "Twist",
942
+ "description": "Y-rotation of the cross-section over the full height in radians; spirals the bark like wrung wood. Construction-only.",
943
+ "type": "number",
944
+ "control": null,
945
+ "defaultValue": 0,
946
+ "serializable": true,
947
+ "bake": "rebuild",
948
+ "range": {
949
+ "max": 4,
950
+ "min": -4,
951
+ "step": 0.05
952
+ },
953
+ "options": null,
954
+ "optionLabels": null,
955
+ "optionDisabled": null
956
+ },
957
+ "gnarl": {
958
+ "id": "trunk.gnarl",
959
+ "group": "trunk",
960
+ "key": "gnarl",
961
+ "label": "Gnarl",
962
+ "description": "High-frequency wiggle and radius bulges: 0 is a clean park tree, 1+ reads like an old bonsai. Construction-only.",
963
+ "type": "number",
964
+ "control": null,
965
+ "defaultValue": 0,
966
+ "serializable": true,
967
+ "bake": "rebuild",
968
+ "range": {
969
+ "max": 2,
970
+ "min": 0,
971
+ "step": 0.01
972
+ },
973
+ "options": null,
974
+ "optionLabels": null,
975
+ "optionDisabled": null
976
+ },
977
+ "bendDirectionAuto": {
978
+ "id": "trunk.bendDirectionAuto",
979
+ "group": "trunk",
980
+ "key": "bendDirectionAuto",
981
+ "label": "Auto Bend Heading",
982
+ "description": "Pick the bow heading from the seed instead of the slider below.",
983
+ "type": "boolean",
984
+ "control": null,
985
+ "defaultValue": true,
986
+ "serializable": true,
987
+ "bake": "rebuild",
988
+ "range": null,
989
+ "options": null,
990
+ "optionLabels": null,
991
+ "optionDisabled": null
992
+ },
993
+ "bendDirection": {
994
+ "id": "trunk.bendDirection",
995
+ "group": "trunk",
996
+ "key": "bendDirection",
997
+ "label": "Bend Direction",
998
+ "description": "World heading of the bow in radians; null/unset picks a seeded heading. Construction-only.",
999
+ "type": "number",
1000
+ "control": null,
1001
+ "defaultValue": 0,
1002
+ "serializable": true,
1003
+ "bake": "rebuild",
1004
+ "range": {
1005
+ "max": 6.283,
1006
+ "min": -6.283,
1007
+ "step": 0.01
1008
+ },
1009
+ "options": null,
1010
+ "optionLabels": null,
1011
+ "optionDisabled": null
1012
+ },
1013
+ "leanOffsetAuto": {
1014
+ "id": "trunk.leanOffsetAuto",
1015
+ "group": "trunk",
1016
+ "key": "leanOffsetAuto",
1017
+ "label": "Auto Lean Offset",
1018
+ "description": "Pick the lean heading from the seed; off + π gives the serpentine S-trunk.",
1019
+ "type": "boolean",
1020
+ "control": null,
1021
+ "defaultValue": true,
1022
+ "serializable": true,
1023
+ "bake": "rebuild",
1024
+ "range": null,
1025
+ "options": null,
1026
+ "optionLabels": null,
1027
+ "optionDisabled": null
1028
+ },
1029
+ "leanOffset": {
1030
+ "id": "trunk.leanOffset",
1031
+ "group": "trunk",
1032
+ "key": "leanOffset",
1033
+ "label": "Lean Offset",
1034
+ "description": "Lean heading relative to the bow in radians (PI pins a serpentine S-trunk); null/unset picks a seeded offset. Construction-only.",
1035
+ "type": "number",
1036
+ "control": null,
1037
+ "defaultValue": 3.141592653589793,
1038
+ "serializable": true,
1039
+ "bake": "rebuild",
1040
+ "range": {
1041
+ "max": 6.283,
1042
+ "min": -6.283,
1043
+ "step": 0.01
1044
+ },
1045
+ "options": null,
1046
+ "optionLabels": null,
1047
+ "optionDisabled": null
1048
+ }
1049
+ },
1050
+ "skeleton": {
1051
+ "generator": {
1052
+ "id": "skeleton.generator",
1053
+ "group": "skeleton",
1054
+ "key": "generator",
1055
+ "label": "Generator",
1056
+ "description": "limbs: space-colonization growth toward the crown blobs (solid anime-style crowns). branching: recursive central-leader branching (open, realistic broadleaf/conifer silhouettes). drawn: no procedural wood at all — the tree is exactly the hand-drawn branchSpines (Tree Lab sketch mode). Construction-only.",
1057
+ "type": "select",
1058
+ "control": null,
1059
+ "defaultValue": "limbs",
1060
+ "serializable": true,
1061
+ "bake": "rebuild",
1062
+ "range": null,
1063
+ "options": [
1064
+ "limbs",
1065
+ "branching",
1066
+ "drawn"
1067
+ ],
1068
+ "optionLabels": {
1069
+ "limbs": "Grown Limbs",
1070
+ "branching": "Recursive Branching",
1071
+ "drawn": "Hand-Drawn"
1072
+ },
1073
+ "optionDisabled": null
1074
+ },
1075
+ "levels": {
1076
+ "id": "skeleton.levels",
1077
+ "group": "skeleton",
1078
+ "key": "levels",
1079
+ "label": "Branch Levels",
1080
+ "description": "Recursion depth of the branching generator; each level subdivides into thinner children. Branching generator only. Construction-only.",
1081
+ "type": "number",
1082
+ "control": null,
1083
+ "defaultValue": 3,
1084
+ "serializable": true,
1085
+ "bake": "rebuild",
1086
+ "range": {
1087
+ "max": 4,
1088
+ "min": 1,
1089
+ "step": 1
1090
+ },
1091
+ "options": null,
1092
+ "optionLabels": null,
1093
+ "optionDisabled": null
1094
+ },
1095
+ "childrenCount": {
1096
+ "id": "skeleton.childrenCount",
1097
+ "group": "skeleton",
1098
+ "key": "childrenCount",
1099
+ "label": "Children",
1100
+ "description": "Lateral child branches sprouting along the trunk (deeper levels derive from them). The central leader continues separately, so children=1 forms one lateral limb plus the leader. Conifers use high counts (60-90) for dense whorled fronds. Branching generator only. Construction-only.",
1101
+ "type": "number",
1102
+ "control": null,
1103
+ "defaultValue": 6,
1104
+ "serializable": true,
1105
+ "bake": "rebuild",
1106
+ "range": {
1107
+ "max": 90,
1108
+ "min": 1,
1109
+ "step": 1
1110
+ },
1111
+ "options": null,
1112
+ "optionLabels": null,
1113
+ "optionDisabled": null
1114
+ },
1115
+ "branchAngle": {
1116
+ "id": "skeleton.branchAngle",
1117
+ "group": "skeleton",
1118
+ "key": "branchAngle",
1119
+ "label": "Branch Angle",
1120
+ "description": "Child pitch away from the parent axis, in degrees. Past 90 points branches below horizontal (conifer fronds ~110). Branching generator only. Construction-only.",
1121
+ "type": "number",
1122
+ "control": null,
1123
+ "defaultValue": 55,
1124
+ "serializable": true,
1125
+ "bake": "rebuild",
1126
+ "range": {
1127
+ "max": 130,
1128
+ "min": 10,
1129
+ "step": 1
1130
+ },
1131
+ "options": null,
1132
+ "optionLabels": null,
1133
+ "optionDisabled": null
1134
+ },
1135
+ "branchStart": {
1136
+ "id": "skeleton.branchStart",
1137
+ "group": "skeleton",
1138
+ "key": "branchStart",
1139
+ "label": "Branch Start",
1140
+ "description": "Fraction of the trunk kept bare before children begin — real trees hold their crown off the ground. Branching generator only. Construction-only.",
1141
+ "type": "number",
1142
+ "control": null,
1143
+ "defaultValue": 0.4,
1144
+ "serializable": true,
1145
+ "bake": "rebuild",
1146
+ "range": {
1147
+ "max": 0.9,
1148
+ "min": 0,
1149
+ "step": 0.01
1150
+ },
1151
+ "options": null,
1152
+ "optionLabels": null,
1153
+ "optionDisabled": null
1154
+ },
1155
+ "lengthRatio": {
1156
+ "id": "skeleton.lengthRatio",
1157
+ "group": "skeleton",
1158
+ "key": "lengthRatio",
1159
+ "label": "Length Ratio",
1160
+ "description": "Child branch length as a fraction of the trunk (deeper levels shorten from it). Branching generator only. Construction-only.",
1161
+ "type": "number",
1162
+ "control": null,
1163
+ "defaultValue": 0.45,
1164
+ "serializable": true,
1165
+ "bake": "rebuild",
1166
+ "range": {
1167
+ "max": 0.95,
1168
+ "min": 0.15,
1169
+ "step": 0.01
1170
+ },
1171
+ "options": null,
1172
+ "optionLabels": null,
1173
+ "optionDisabled": null
1174
+ },
1175
+ "radiusRatio": {
1176
+ "id": "skeleton.radiusRatio",
1177
+ "group": "skeleton",
1178
+ "key": "radiusRatio",
1179
+ "label": "Radius Ratio",
1180
+ "description": "Child radius as a fraction of the parent\\u2019s radius at the attach point — radius continuity is what makes forks read as one tree. Branching generator only. Construction-only.",
1181
+ "type": "number",
1182
+ "control": null,
1183
+ "defaultValue": 0.7,
1184
+ "serializable": true,
1185
+ "bake": "rebuild",
1186
+ "range": {
1187
+ "max": 0.9,
1188
+ "min": 0.3,
1189
+ "step": 0.01
1190
+ },
1191
+ "options": null,
1192
+ "optionLabels": null,
1193
+ "optionDisabled": null
1194
+ },
1195
+ "gnarliness": {
1196
+ "id": "skeleton.gnarliness",
1197
+ "group": "skeleton",
1198
+ "key": "gnarliness",
1199
+ "label": "Gnarliness",
1200
+ "description": "Random-walk curvature per growth section, amplified as branches thin: trunks stay stately, twigs wander. Branching generator only. Construction-only.",
1201
+ "type": "number",
1202
+ "control": null,
1203
+ "defaultValue": 0.15,
1204
+ "serializable": true,
1205
+ "bake": "rebuild",
1206
+ "range": {
1207
+ "max": 0.6,
1208
+ "min": 0,
1209
+ "step": 0.01
1210
+ },
1211
+ "options": null,
1212
+ "optionLabels": null,
1213
+ "optionDisabled": null
1214
+ },
1215
+ "forceStrength": {
1216
+ "id": "skeleton.forceStrength",
1217
+ "group": "skeleton",
1218
+ "key": "forceStrength",
1219
+ "label": "Growth Force",
1220
+ "description": "Growth force: every section steers toward vertical with 1/radius compliance. Positive sweeps tips skyward (broadleaf crowns); negative droops them (pines, willows). Branching generator only. Construction-only.",
1221
+ "type": "number",
1222
+ "control": null,
1223
+ "defaultValue": 0.02,
1224
+ "serializable": true,
1225
+ "bake": "rebuild",
1226
+ "range": {
1227
+ "max": 0.15,
1228
+ "min": -0.08,
1229
+ "step": 0.005
1230
+ },
1231
+ "options": null,
1232
+ "optionLabels": null,
1233
+ "optionDisabled": null
1234
+ },
1235
+ "phyllotaxisAngle": {
1236
+ "id": "skeleton.phyllotaxisAngle",
1237
+ "group": "skeleton",
1238
+ "key": "phyllotaxisAngle",
1239
+ "label": "Divergence angle",
1240
+ "description": "Azimuthal rotation in degrees between successive branch initiations.",
1241
+ "type": "number",
1242
+ "control": null,
1243
+ "defaultValue": 137.5,
1244
+ "serializable": true,
1245
+ "bake": "rebuild",
1246
+ "range": {
1247
+ "min": 30,
1248
+ "max": 180,
1249
+ "step": 0.5
1250
+ },
1251
+ "options": null,
1252
+ "optionLabels": null,
1253
+ "optionDisabled": null
1254
+ },
1255
+ "branchInternodeSpacing": {
1256
+ "id": "skeleton.branchInternodeSpacing",
1257
+ "group": "skeleton",
1258
+ "key": "branchInternodeSpacing",
1259
+ "label": "Branch internode",
1260
+ "description": "Average vertical spacing between primary branch initiations.",
1261
+ "type": "number",
1262
+ "control": null,
1263
+ "defaultValue": 0.65,
1264
+ "serializable": true,
1265
+ "bake": "rebuild",
1266
+ "range": {
1267
+ "min": 0.08,
1268
+ "max": 3,
1269
+ "step": 0.02
1270
+ },
1271
+ "options": null,
1272
+ "optionLabels": null,
1273
+ "optionDisabled": null
1274
+ },
1275
+ "gravitropism": {
1276
+ "id": "skeleton.gravitropism",
1277
+ "group": "skeleton",
1278
+ "key": "gravitropism",
1279
+ "label": "Upward growth",
1280
+ "description": "Long-term correction of growing axes against gravity.",
1281
+ "type": "number",
1282
+ "control": null,
1283
+ "defaultValue": 0.04,
1284
+ "serializable": true,
1285
+ "bake": "rebuild",
1286
+ "range": {
1287
+ "min": -0.1,
1288
+ "max": 0.25,
1289
+ "step": 0.005
1290
+ },
1291
+ "options": null,
1292
+ "optionLabels": null,
1293
+ "optionDisabled": null
1294
+ },
1295
+ "phototropism": {
1296
+ "id": "skeleton.phototropism",
1297
+ "group": "skeleton",
1298
+ "key": "phototropism",
1299
+ "label": "Light seeking",
1300
+ "description": "Bias growing tips toward the crown light direction.",
1301
+ "type": "number",
1302
+ "control": null,
1303
+ "defaultValue": 0.035,
1304
+ "serializable": true,
1305
+ "bake": "rebuild",
1306
+ "range": {
1307
+ "min": 0,
1308
+ "max": 0.2,
1309
+ "step": 0.005
1310
+ },
1311
+ "options": null,
1312
+ "optionLabels": null,
1313
+ "optionDisabled": null
1314
+ },
1315
+ "branchSag": {
1316
+ "id": "skeleton.branchSag",
1317
+ "group": "skeleton",
1318
+ "key": "branchSag",
1319
+ "label": "Branch sag",
1320
+ "description": "Downward compliance accumulated along horizontal, slender branches.",
1321
+ "type": "number",
1322
+ "control": null,
1323
+ "defaultValue": 0.018,
1324
+ "serializable": true,
1325
+ "bake": "rebuild",
1326
+ "range": {
1327
+ "min": 0,
1328
+ "max": 0.25,
1329
+ "step": 0.005
1330
+ },
1331
+ "options": null,
1332
+ "optionLabels": null,
1333
+ "optionDisabled": null
1334
+ },
1335
+ "tipUpturn": {
1336
+ "id": "skeleton.tipUpturn",
1337
+ "group": "skeleton",
1338
+ "key": "tipUpturn",
1339
+ "label": "Tip recovery",
1340
+ "description": "Upward correction near branch endpoints after sag and wind.",
1341
+ "type": "number",
1342
+ "control": null,
1343
+ "defaultValue": 0.12,
1344
+ "serializable": true,
1345
+ "bake": "rebuild",
1346
+ "range": {
1347
+ "min": 0,
1348
+ "max": 0.4,
1349
+ "step": 0.005
1350
+ },
1351
+ "options": null,
1352
+ "optionLabels": null,
1353
+ "optionDisabled": null
1354
+ },
1355
+ "windBias": {
1356
+ "id": "skeleton.windBias",
1357
+ "group": "skeleton",
1358
+ "key": "windBias",
1359
+ "label": "Prevailing wind",
1360
+ "description": "Persistent growth bias from the prevailing wind, separate from live animation.",
1361
+ "type": "number",
1362
+ "control": null,
1363
+ "defaultValue": 0,
1364
+ "serializable": true,
1365
+ "bake": "rebuild",
1366
+ "range": {
1367
+ "min": -0.2,
1368
+ "max": 0.2,
1369
+ "step": 0.005
1370
+ },
1371
+ "options": null,
1372
+ "optionLabels": null,
1373
+ "optionDisabled": null
1374
+ },
1375
+ "pipeExponent": {
1376
+ "id": "skeleton.pipeExponent",
1377
+ "group": "skeleton",
1378
+ "key": "pipeExponent",
1379
+ "label": "Pipe exponent",
1380
+ "description": "Area-preserving exponent used to distribute parent radius across child axes.",
1381
+ "type": "number",
1382
+ "control": null,
1383
+ "defaultValue": 2.18,
1384
+ "serializable": true,
1385
+ "bake": "rebuild",
1386
+ "range": {
1387
+ "min": 1.6,
1388
+ "max": 3.2,
1389
+ "step": 0.02
1390
+ },
1391
+ "options": null,
1392
+ "optionLabels": null,
1393
+ "optionDisabled": null
1394
+ },
1395
+ "junctionBulge": {
1396
+ "id": "skeleton.junctionBulge",
1397
+ "group": "skeleton",
1398
+ "key": "junctionBulge",
1399
+ "label": "Branch collar",
1400
+ "description": "Subtle radius reinforcement at the first ring of a child axis.",
1401
+ "type": "number",
1402
+ "control": null,
1403
+ "defaultValue": 1.1,
1404
+ "serializable": true,
1405
+ "bake": "rebuild",
1406
+ "range": {
1407
+ "min": 1,
1408
+ "max": 1.24,
1409
+ "step": 0.01
1410
+ },
1411
+ "options": null,
1412
+ "optionLabels": null,
1413
+ "optionDisabled": null
1414
+ },
1415
+ "conifer": {
1416
+ "id": "skeleton.conifer",
1417
+ "group": "skeleton",
1418
+ "key": "conifer",
1419
+ "label": "Conifer",
1420
+ "description": "Evergreen behavior: branches taper fully and children shorten toward the top \\u2014 the layered cone silhouette. Pair with high Children, Branch Angle ~110, negative Growth Force. Branching generator only. Construction-only.",
1421
+ "type": "boolean",
1422
+ "control": null,
1423
+ "defaultValue": false,
1424
+ "serializable": true,
1425
+ "bake": "rebuild",
1426
+ "range": null,
1427
+ "options": null,
1428
+ "optionLabels": null,
1429
+ "optionDisabled": null
1430
+ },
1431
+ "attractionCount": {
1432
+ "id": "skeleton.attractionCount",
1433
+ "group": "skeleton",
1434
+ "key": "attractionCount",
1435
+ "label": "Attraction Count",
1436
+ "description": "Number of crown attraction points the limbs grow toward; more points grow more, finer limbs. Construction-only.",
1437
+ "type": "number",
1438
+ "control": null,
1439
+ "defaultValue": 90,
1440
+ "serializable": true,
1441
+ "bake": "rebuild",
1442
+ "range": {
1443
+ "max": 200,
1444
+ "min": 10,
1445
+ "step": 1
1446
+ },
1447
+ "options": null,
1448
+ "optionLabels": null,
1449
+ "optionDisabled": null
1450
+ },
1451
+ "segmentLength": {
1452
+ "id": "skeleton.segmentLength",
1453
+ "group": "skeleton",
1454
+ "key": "segmentLength",
1455
+ "label": "Segment Length",
1456
+ "description": "Growth step length in meters; shorter steps grow smoother, curvier limbs. Construction-only.",
1457
+ "type": "number",
1458
+ "control": null,
1459
+ "defaultValue": 0.3,
1460
+ "serializable": true,
1461
+ "bake": "rebuild",
1462
+ "range": {
1463
+ "max": 0.8,
1464
+ "min": 0.1,
1465
+ "step": 0.01
1466
+ },
1467
+ "options": null,
1468
+ "optionLabels": null,
1469
+ "optionDisabled": null
1470
+ },
1471
+ "influenceRadius": {
1472
+ "id": "skeleton.influenceRadius",
1473
+ "group": "skeleton",
1474
+ "key": "influenceRadius",
1475
+ "label": "Influence Radius",
1476
+ "description": "How far an attraction point can pull on a growing limb, in meters. Construction-only.",
1477
+ "type": "number",
1478
+ "control": null,
1479
+ "defaultValue": 1.2,
1480
+ "serializable": true,
1481
+ "bake": "rebuild",
1482
+ "range": {
1483
+ "max": 2.5,
1484
+ "min": 0.3,
1485
+ "step": 0.05
1486
+ },
1487
+ "options": null,
1488
+ "optionLabels": null,
1489
+ "optionDisabled": null
1490
+ },
1491
+ "killRadius": {
1492
+ "id": "skeleton.killRadius",
1493
+ "group": "skeleton",
1494
+ "key": "killRadius",
1495
+ "label": "Kill Radius",
1496
+ "description": "Distance at which a limb consumes an attraction point and stops growing toward it. Construction-only.",
1497
+ "type": "number",
1498
+ "control": null,
1499
+ "defaultValue": 0.42,
1500
+ "serializable": true,
1501
+ "bake": "rebuild",
1502
+ "range": {
1503
+ "max": 1,
1504
+ "min": 0.1,
1505
+ "step": 0.01
1506
+ },
1507
+ "options": null,
1508
+ "optionLabels": null,
1509
+ "optionDisabled": null
1510
+ },
1511
+ "maxNodes": {
1512
+ "id": "skeleton.maxNodes",
1513
+ "group": "skeleton",
1514
+ "key": "maxNodes",
1515
+ "label": "Max Nodes",
1516
+ "description": "Skeleton node cap; lower keeps trees to a few clean limbs. Construction-only.",
1517
+ "type": "number",
1518
+ "control": null,
1519
+ "defaultValue": 140,
1520
+ "serializable": true,
1521
+ "bake": "rebuild",
1522
+ "range": {
1523
+ "max": 400,
1524
+ "min": 20,
1525
+ "step": 1
1526
+ },
1527
+ "options": null,
1528
+ "optionLabels": null,
1529
+ "optionDisabled": null
1530
+ },
1531
+ "radialSegments": {
1532
+ "id": "skeleton.radialSegments",
1533
+ "group": "skeleton",
1534
+ "key": "radialSegments",
1535
+ "label": "Radial Segments",
1536
+ "description": "Cross-section segment count of each bark tube. Construction-only.",
1537
+ "type": "number",
1538
+ "control": null,
1539
+ "defaultValue": 8,
1540
+ "serializable": true,
1541
+ "bake": "rebuild",
1542
+ "range": {
1543
+ "max": 16,
1544
+ "min": 3,
1545
+ "step": 1
1546
+ },
1547
+ "options": null,
1548
+ "optionLabels": null,
1549
+ "optionDisabled": null
1550
+ },
1551
+ "tipRadius": {
1552
+ "id": "skeleton.tipRadius",
1553
+ "group": "skeleton",
1554
+ "key": "tipRadius",
1555
+ "label": "Tip Radius",
1556
+ "description": "Radius of the thinnest twigs in meters; pipe-model radii grow from here toward the root. Construction-only.",
1557
+ "type": "number",
1558
+ "control": null,
1559
+ "defaultValue": 0.03,
1560
+ "serializable": true,
1561
+ "bake": "rebuild",
1562
+ "range": {
1563
+ "max": 0.15,
1564
+ "min": 0.005,
1565
+ "step": 0.001
1566
+ },
1567
+ "options": null,
1568
+ "optionLabels": null,
1569
+ "optionDisabled": null
1570
+ },
1571
+ "minLimbRadius": {
1572
+ "id": "skeleton.minLimbRadius",
1573
+ "group": "skeleton",
1574
+ "key": "minLimbRadius",
1575
+ "label": "Min Limb Radius",
1576
+ "description": "Limbs thinner than this get no bark tube and are left to the leaves. Construction-only.",
1577
+ "type": "number",
1578
+ "control": null,
1579
+ "defaultValue": 0.028,
1580
+ "serializable": true,
1581
+ "bake": "rebuild",
1582
+ "range": {
1583
+ "max": 0.15,
1584
+ "min": 0,
1585
+ "step": 0.001
1586
+ },
1587
+ "options": null,
1588
+ "optionLabels": null,
1589
+ "optionDisabled": null
1590
+ },
1591
+ "attractionReachAuto": {
1592
+ "id": "skeleton.attractionReachAuto",
1593
+ "group": "skeleton",
1594
+ "key": "attractionReachAuto",
1595
+ "label": "Auto Reach",
1596
+ "description": "Derive attraction depth from leaf placement (buried for canopy, near-shell for tips).",
1597
+ "type": "boolean",
1598
+ "control": null,
1599
+ "defaultValue": true,
1600
+ "serializable": true,
1601
+ "bake": "rebuild",
1602
+ "range": null,
1603
+ "options": null,
1604
+ "optionLabels": null,
1605
+ "optionDisabled": null
1606
+ },
1607
+ "attractionReach": {
1608
+ "id": "skeleton.attractionReach",
1609
+ "group": "skeleton",
1610
+ "key": "attractionReach",
1611
+ "label": "Attraction Reach",
1612
+ "description": "How deep into each crown blob attraction points sample (fraction of blob radius); null/unset is automatic (0.65 canopy mode, 0.92 tips mode). Construction-only.",
1613
+ "type": "number",
1614
+ "control": null,
1615
+ "defaultValue": 0.65,
1616
+ "serializable": true,
1617
+ "bake": "rebuild",
1618
+ "range": {
1619
+ "max": 1,
1620
+ "min": 0,
1621
+ "step": 0.01
1622
+ },
1623
+ "options": null,
1624
+ "optionLabels": null,
1625
+ "optionDisabled": null
1626
+ }
1627
+ },
1628
+ "canopy": {
1629
+ "width": {
1630
+ "id": "canopy.width",
1631
+ "group": "canopy",
1632
+ "key": "width",
1633
+ "label": "Canopy Width",
1634
+ "description": "X-axis crown reach multiplier. Construction-only: shapes the blob layout.",
1635
+ "type": "number",
1636
+ "control": null,
1637
+ "defaultValue": 1,
1638
+ "serializable": true,
1639
+ "bake": "rebuild",
1640
+ "range": {
1641
+ "max": 2.5,
1642
+ "min": 0.3,
1643
+ "step": 0.05
1644
+ },
1645
+ "options": null,
1646
+ "optionLabels": null,
1647
+ "optionDisabled": null
1648
+ },
1649
+ "depth": {
1650
+ "id": "canopy.depth",
1651
+ "group": "canopy",
1652
+ "key": "depth",
1653
+ "label": "Canopy Depth",
1654
+ "description": "Z-axis crown reach multiplier. Construction-only: shapes the blob layout.",
1655
+ "type": "number",
1656
+ "control": null,
1657
+ "defaultValue": 1,
1658
+ "serializable": true,
1659
+ "bake": "rebuild",
1660
+ "range": {
1661
+ "max": 2.5,
1662
+ "min": 0.3,
1663
+ "step": 0.05
1664
+ },
1665
+ "options": null,
1666
+ "optionLabels": null,
1667
+ "optionDisabled": null
1668
+ },
1669
+ "flatten": {
1670
+ "id": "canopy.flatten",
1671
+ "group": "canopy",
1672
+ "key": "flatten",
1673
+ "label": "Flatten",
1674
+ "description": "Vertical squash of the lobes; low values give the wide layered look.",
1675
+ "type": "number",
1676
+ "control": null,
1677
+ "defaultValue": 0.5,
1678
+ "serializable": true,
1679
+ "bake": "rebuild",
1680
+ "range": {
1681
+ "min": 0.1,
1682
+ "max": 1,
1683
+ "step": 0.05
1684
+ },
1685
+ "options": null,
1686
+ "optionLabels": null,
1687
+ "optionDisabled": null
1688
+ },
1689
+ "lobeCount": {
1690
+ "id": "canopy.lobeCount",
1691
+ "group": "canopy",
1692
+ "key": "lobeCount",
1693
+ "label": "Lobes",
1694
+ "description": "Satellite blobs ringing the crown core.",
1695
+ "type": "number",
1696
+ "control": null,
1697
+ "defaultValue": 6,
1698
+ "serializable": true,
1699
+ "bake": "rebuild",
1700
+ "range": {
1701
+ "min": 2,
1702
+ "max": 10,
1703
+ "step": 1
1704
+ },
1705
+ "options": null,
1706
+ "optionLabels": null,
1707
+ "optionDisabled": null
1708
+ },
1709
+ "spread": {
1710
+ "id": "canopy.spread",
1711
+ "group": "canopy",
1712
+ "key": "spread",
1713
+ "label": "Spread",
1714
+ "description": "Horizontal reach of the lobes (1 ≈ core radius).",
1715
+ "type": "number",
1716
+ "control": null,
1717
+ "defaultValue": 1.25,
1718
+ "serializable": true,
1719
+ "bake": "rebuild",
1720
+ "range": {
1721
+ "min": 0.5,
1722
+ "max": 2,
1723
+ "step": 0.05
1724
+ },
1725
+ "options": null,
1726
+ "optionLabels": null,
1727
+ "optionDisabled": null
1728
+ },
1729
+ "coreRadius": {
1730
+ "id": "canopy.coreRadius",
1731
+ "group": "canopy",
1732
+ "key": "coreRadius",
1733
+ "label": "Core Radius",
1734
+ "description": "Central blob radius.",
1735
+ "type": "number",
1736
+ "control": null,
1737
+ "defaultValue": 0.9,
1738
+ "serializable": true,
1739
+ "bake": "rebuild",
1740
+ "range": {
1741
+ "min": 0.4,
1742
+ "max": 1.2,
1743
+ "step": 0.05
1744
+ },
1745
+ "options": null,
1746
+ "optionLabels": null,
1747
+ "optionDisabled": null
1748
+ },
1749
+ "canopyScale": {
1750
+ "id": "canopy.canopyScale",
1751
+ "group": "canopy",
1752
+ "key": "canopyScale",
1753
+ "label": "Canopy Scale",
1754
+ "description": "Canopy-only scale relative to the trunk. Construction-only.",
1755
+ "type": "number",
1756
+ "control": null,
1757
+ "defaultValue": 1,
1758
+ "serializable": true,
1759
+ "bake": "rebuild",
1760
+ "range": {
1761
+ "max": 3,
1762
+ "min": 0.2,
1763
+ "step": 0.05
1764
+ },
1765
+ "options": null,
1766
+ "optionLabels": null,
1767
+ "optionDisabled": null
1768
+ }
1769
+ },
1770
+ "leaves": {
1771
+ "architecture": {
1772
+ "id": "leaves.architecture",
1773
+ "group": "leaves",
1774
+ "key": "architecture",
1775
+ "label": "Architecture",
1776
+ "description": "Branch-attached foliage layout: historical round clouds, stacked sprays, conifer whorls, or palm-like radial fronds. Construction-only.",
1777
+ "type": "select",
1778
+ "control": null,
1779
+ "defaultValue": "cloud-cards",
1780
+ "serializable": true,
1781
+ "bake": "rebuild",
1782
+ "range": null,
1783
+ "options": [
1784
+ "cloud-cards",
1785
+ "layered-sprays",
1786
+ "needle-whorls",
1787
+ "radial-fronds"
1788
+ ],
1789
+ "optionLabels": {
1790
+ "cloud-cards": "Cloud Cards",
1791
+ "layered-sprays": "Layered Sprays",
1792
+ "needle-whorls": "Needle Whorls",
1793
+ "radial-fronds": "Radial Fronds"
1794
+ },
1795
+ "optionDisabled": null
1796
+ },
1797
+ "placement": {
1798
+ "id": "leaves.placement",
1799
+ "group": "leaves",
1800
+ "key": "placement",
1801
+ "label": "Leaf Placement",
1802
+ "description": "canopy: solid leaf mass hiding interior wood. tips: bushes only at branch ends with bare limbs between them (Sumeru silhouette). Construction-only.",
1803
+ "type": "select",
1804
+ "control": null,
1805
+ "defaultValue": "canopy",
1806
+ "serializable": true,
1807
+ "bake": "rebuild",
1808
+ "range": null,
1809
+ "options": [
1810
+ "canopy",
1811
+ "tips"
1812
+ ],
1813
+ "optionLabels": {
1814
+ "canopy": "Solid Canopy",
1815
+ "tips": "Branch Tips"
1816
+ },
1817
+ "optionDisabled": null
1818
+ },
1819
+ "density": {
1820
+ "id": "leaves.density",
1821
+ "group": "leaves",
1822
+ "key": "density",
1823
+ "label": "Leaf Density",
1824
+ "description": "Crown leaf coverage. Below ~0.9 see-through gap pockets open and branches read through; above 1 packs extra cards (and fatter tufts) for lush crowns. Construction-only.",
1825
+ "type": "number",
1826
+ "control": null,
1827
+ "defaultValue": 1,
1828
+ "serializable": true,
1829
+ "bake": "rebuild",
1830
+ "range": {
1831
+ "max": 2,
1832
+ "min": 0.05,
1833
+ "step": 0.01
1834
+ },
1835
+ "options": null,
1836
+ "optionLabels": null,
1837
+ "optionDisabled": null
1838
+ },
1839
+ "cardCount": {
1840
+ "id": "leaves.cardCount",
1841
+ "group": "leaves",
1842
+ "key": "cardCount",
1843
+ "label": "Card Count",
1844
+ "description": "Base leaf-card count before density and coverage scaling; few LARGE overlapping cards keep the crown one fluffy mass. Construction-only.",
1845
+ "type": "number",
1846
+ "control": null,
1847
+ "defaultValue": 170,
1848
+ "serializable": true,
1849
+ "bake": "rebuild",
1850
+ "range": {
1851
+ "max": 600,
1852
+ "min": 20,
1853
+ "step": 1
1854
+ },
1855
+ "options": null,
1856
+ "optionLabels": null,
1857
+ "optionDisabled": null
1858
+ },
1859
+ "cardSizeMin": {
1860
+ "id": "leaves.cardSizeMin",
1861
+ "group": "leaves",
1862
+ "key": "cardSizeMin",
1863
+ "label": "Card Size Min",
1864
+ "description": "Min/max leaf-cluster card size in meters. Construction-only.",
1865
+ "type": "number",
1866
+ "control": null,
1867
+ "defaultValue": 1,
1868
+ "serializable": true,
1869
+ "bake": "rebuild",
1870
+ "range": {
1871
+ "min": 0.4,
1872
+ "max": 2,
1873
+ "step": 0.05
1874
+ },
1875
+ "options": null,
1876
+ "optionLabels": null,
1877
+ "optionDisabled": null
1878
+ },
1879
+ "cardSizeMax": {
1880
+ "id": "leaves.cardSizeMax",
1881
+ "group": "leaves",
1882
+ "key": "cardSizeMax",
1883
+ "label": "Card Size Max",
1884
+ "description": "Min/max leaf-cluster card size in meters. Construction-only.",
1885
+ "type": "number",
1886
+ "control": null,
1887
+ "defaultValue": 1.6,
1888
+ "serializable": true,
1889
+ "bake": "rebuild",
1890
+ "range": {
1891
+ "min": 0.4,
1892
+ "max": 2.4,
1893
+ "step": 0.05
1894
+ },
1895
+ "options": null,
1896
+ "optionLabels": null,
1897
+ "optionDisabled": null
1898
+ },
1899
+ "cardsPerCluster": {
1900
+ "id": "leaves.cardsPerCluster",
1901
+ "group": "leaves",
1902
+ "key": "cardsPerCluster",
1903
+ "label": "Cards Per Cluster",
1904
+ "description": "Cards per leaf tuft around each branch attachment. Construction-only. (In tips placement the built-in default becomes 9.)",
1905
+ "type": "number",
1906
+ "control": null,
1907
+ "defaultValue": 5,
1908
+ "serializable": true,
1909
+ "bake": "rebuild",
1910
+ "range": {
1911
+ "max": 20,
1912
+ "min": 1,
1913
+ "step": 1
1914
+ },
1915
+ "options": null,
1916
+ "optionLabels": null,
1917
+ "optionDisabled": null
1918
+ },
1919
+ "clusterRadius": {
1920
+ "id": "leaves.clusterRadius",
1921
+ "group": "leaves",
1922
+ "key": "clusterRadius",
1923
+ "label": "Cluster Radius",
1924
+ "description": "Radius in meters of each leaf tuft around its branch end. Construction-only. (In tips placement the built-in default becomes 0.62.)",
1925
+ "type": "number",
1926
+ "control": null,
1927
+ "defaultValue": 0.48,
1928
+ "serializable": true,
1929
+ "bake": "rebuild",
1930
+ "range": {
1931
+ "max": 1.5,
1932
+ "min": 0.1,
1933
+ "step": 0.01
1934
+ },
1935
+ "options": null,
1936
+ "optionLabels": null,
1937
+ "optionDisabled": null
1938
+ },
1939
+ "sprayLayers": {
1940
+ "id": "leaves.sprayLayers",
1941
+ "group": "leaves",
1942
+ "key": "sprayLayers",
1943
+ "label": "Spray Layers",
1944
+ "description": "Number of stacked foliage planes at each layered-spray attachment. Construction-only.",
1945
+ "type": "number",
1946
+ "control": null,
1947
+ "defaultValue": 3,
1948
+ "serializable": true,
1949
+ "bake": "rebuild",
1950
+ "range": {
1951
+ "max": 12,
1952
+ "min": 1,
1953
+ "step": 1
1954
+ },
1955
+ "options": null,
1956
+ "optionLabels": null,
1957
+ "optionDisabled": null
1958
+ },
1959
+ "spraySpread": {
1960
+ "id": "leaves.spraySpread",
1961
+ "group": "leaves",
1962
+ "key": "spraySpread",
1963
+ "label": "Spray Spread",
1964
+ "description": "Branch-local radius of each layered spray in meters. Construction-only.",
1965
+ "type": "number",
1966
+ "control": null,
1967
+ "defaultValue": 0.8,
1968
+ "serializable": true,
1969
+ "bake": "rebuild",
1970
+ "range": {
1971
+ "max": 4,
1972
+ "min": 0.05,
1973
+ "step": 0.01
1974
+ },
1975
+ "options": null,
1976
+ "optionLabels": null,
1977
+ "optionDisabled": null
1978
+ },
1979
+ "sprayThickness": {
1980
+ "id": "leaves.sprayThickness",
1981
+ "group": "leaves",
1982
+ "key": "sprayThickness",
1983
+ "label": "Spray Thickness",
1984
+ "description": "Separation between the stacked spray planes in meters. Construction-only.",
1985
+ "type": "number",
1986
+ "control": null,
1987
+ "defaultValue": 0.18,
1988
+ "serializable": true,
1989
+ "bake": "rebuild",
1990
+ "range": {
1991
+ "max": 2,
1992
+ "min": 0,
1993
+ "step": 0.01
1994
+ },
1995
+ "options": null,
1996
+ "optionLabels": null,
1997
+ "optionDisabled": null
1998
+ },
1999
+ "whorlArms": {
2000
+ "id": "leaves.whorlArms",
2001
+ "group": "leaves",
2002
+ "key": "whorlArms",
2003
+ "label": "Whorl Arms",
2004
+ "description": "Radial arm count around a conifer foliage attachment. Construction-only.",
2005
+ "type": "number",
2006
+ "control": null,
2007
+ "defaultValue": 6,
2008
+ "serializable": true,
2009
+ "bake": "rebuild",
2010
+ "range": {
2011
+ "max": 24,
2012
+ "min": 3,
2013
+ "step": 1
2014
+ },
2015
+ "options": null,
2016
+ "optionLabels": null,
2017
+ "optionDisabled": null
2018
+ },
2019
+ "whorlRadius": {
2020
+ "id": "leaves.whorlRadius",
2021
+ "group": "leaves",
2022
+ "key": "whorlRadius",
2023
+ "label": "Whorl Radius",
2024
+ "description": "Radius of each conifer foliage whorl in meters. Construction-only.",
2025
+ "type": "number",
2026
+ "control": null,
2027
+ "defaultValue": 0.48,
2028
+ "serializable": true,
2029
+ "bake": "rebuild",
2030
+ "range": {
2031
+ "max": 3,
2032
+ "min": 0.05,
2033
+ "step": 0.01
2034
+ },
2035
+ "options": null,
2036
+ "optionLabels": null,
2037
+ "optionDisabled": null
2038
+ },
2039
+ "frondCount": {
2040
+ "id": "leaves.frondCount",
2041
+ "group": "leaves",
2042
+ "key": "frondCount",
2043
+ "label": "Frond Count",
2044
+ "description": "Number of radial frond directions at each attachment. Construction-only.",
2045
+ "type": "number",
2046
+ "control": null,
2047
+ "defaultValue": 7,
2048
+ "serializable": true,
2049
+ "bake": "rebuild",
2050
+ "range": {
2051
+ "max": 24,
2052
+ "min": 3,
2053
+ "step": 1
2054
+ },
2055
+ "options": null,
2056
+ "optionLabels": null,
2057
+ "optionDisabled": null
2058
+ },
2059
+ "frondLength": {
2060
+ "id": "leaves.frondLength",
2061
+ "group": "leaves",
2062
+ "key": "frondLength",
2063
+ "label": "Frond Length",
2064
+ "description": "Maximum radial frond reach in meters. Construction-only.",
2065
+ "type": "number",
2066
+ "control": null,
2067
+ "defaultValue": 1.25,
2068
+ "serializable": true,
2069
+ "bake": "rebuild",
2070
+ "range": {
2071
+ "max": 4,
2072
+ "min": 0.1,
2073
+ "step": 0.01
2074
+ },
2075
+ "options": null,
2076
+ "optionLabels": null,
2077
+ "optionDisabled": null
2078
+ },
2079
+ "shellFill": {
2080
+ "id": "leaves.shellFill",
2081
+ "group": "leaves",
2082
+ "key": "shellFill",
2083
+ "label": "Shell Fill",
2084
+ "description": "Fill the blob shells between tufts so the crown reads as one solid mass; off leaves bare wood between end bushes. Construction-only. (Tips placement turns this off by default.)",
2085
+ "type": "boolean",
2086
+ "control": null,
2087
+ "defaultValue": true,
2088
+ "serializable": true,
2089
+ "bake": "rebuild",
2090
+ "range": null,
2091
+ "options": null,
2092
+ "optionLabels": null,
2093
+ "optionDisabled": null
2094
+ }
2095
+ },
2096
+ "flower": {
2097
+ "species": {
2098
+ "id": "flower.species",
2099
+ "group": "flower",
2100
+ "key": "species",
2101
+ "label": "Species",
2102
+ "description": "Common-flower head at every branch tip (see FLOWER_SPECIES).",
2103
+ "type": "select",
2104
+ "control": null,
2105
+ "defaultValue": "daisy",
2106
+ "serializable": true,
2107
+ "bake": "rebuild",
2108
+ "range": null,
2109
+ "options": [
2110
+ "tulip",
2111
+ "daisy",
2112
+ "blossom",
2113
+ "sunflower",
2114
+ "poppy",
2115
+ "rose",
2116
+ "cornflower",
2117
+ "buttercup"
2118
+ ],
2119
+ "optionLabels": {
2120
+ "tulip": "Tulip",
2121
+ "daisy": "Daisy",
2122
+ "blossom": "Cherry Blossom",
2123
+ "sunflower": "Sunflower",
2124
+ "poppy": "Poppy",
2125
+ "rose": "Rose",
2126
+ "cornflower": "Cornflower",
2127
+ "buttercup": "Buttercup"
2128
+ },
2129
+ "optionDisabled": null
2130
+ },
2131
+ "pinHeadColor": {
2132
+ "id": "flower.pinHeadColor",
2133
+ "group": "flower",
2134
+ "key": "pinHeadColor",
2135
+ "label": "Pin Head Color",
2136
+ "description": "Use the explicit petal color below instead of the species default.",
2137
+ "type": "boolean",
2138
+ "control": null,
2139
+ "defaultValue": false,
2140
+ "serializable": true,
2141
+ "bake": "rebuild",
2142
+ "range": null,
2143
+ "options": null,
2144
+ "optionLabels": null,
2145
+ "optionDisabled": null
2146
+ },
2147
+ "headColor": {
2148
+ "id": "flower.headColor",
2149
+ "group": "flower",
2150
+ "key": "headColor",
2151
+ "label": "Head Color",
2152
+ "description": "Bloom petal color (when pinned).",
2153
+ "type": "color",
2154
+ "control": null,
2155
+ "defaultValue": [
2156
+ 1,
2157
+ 0.98,
2158
+ 0.92
2159
+ ],
2160
+ "serializable": true,
2161
+ "bake": "rebuild",
2162
+ "range": null,
2163
+ "options": null,
2164
+ "optionLabels": null,
2165
+ "optionDisabled": null
2166
+ },
2167
+ "headScale": {
2168
+ "id": "flower.headScale",
2169
+ "group": "flower",
2170
+ "key": "headScale",
2171
+ "label": "Head Size",
2172
+ "description": "Bloom size relative to the leaf tufts.",
2173
+ "type": "number",
2174
+ "control": null,
2175
+ "defaultValue": 1,
2176
+ "serializable": true,
2177
+ "bake": "rebuild",
2178
+ "range": {
2179
+ "min": 0.4,
2180
+ "max": 2,
2181
+ "step": 0.05
2182
+ },
2183
+ "options": null,
2184
+ "optionLabels": null,
2185
+ "optionDisabled": null
2186
+ }
2187
+ },
2188
+ "color": {
2189
+ "canopy": {
2190
+ "id": "color.canopy",
2191
+ "group": "color",
2192
+ "key": "canopy",
2193
+ "label": "Canopy Color",
2194
+ "description": "Canopy base color; the lit/shadow/crown palette derives from it. Also accepts richer resolveCanopyColor specs (color lists, {from,to} blends, HSL ranges) resolved per seed.",
2195
+ "type": "color",
2196
+ "control": null,
2197
+ "defaultValue": [
2198
+ 0.30196078431372547,
2199
+ 0.6352941176470588,
2200
+ 0.34509803921568627
2201
+ ],
2202
+ "serializable": true,
2203
+ "bake": "live",
2204
+ "range": null,
2205
+ "options": null,
2206
+ "optionLabels": null,
2207
+ "optionDisabled": null
2208
+ },
2209
+ "pinLit": {
2210
+ "id": "color.pinLit",
2211
+ "group": "color",
2212
+ "key": "pinLit",
2213
+ "label": "Pin Lit",
2214
+ "description": "Use the explicit lit tone below instead of the base color.",
2215
+ "type": "boolean",
2216
+ "control": null,
2217
+ "defaultValue": false,
2218
+ "serializable": true,
2219
+ "bake": "live",
2220
+ "range": null,
2221
+ "options": null,
2222
+ "optionLabels": null,
2223
+ "optionDisabled": null
2224
+ },
2225
+ "lit": {
2226
+ "id": "color.lit",
2227
+ "group": "color",
2228
+ "key": "lit",
2229
+ "label": "Lit Tone",
2230
+ "description": "Sunlit leaf tone (when pinned).",
2231
+ "type": "color",
2232
+ "control": null,
2233
+ "defaultValue": [
2234
+ 0.30196078431372547,
2235
+ 0.6352941176470588,
2236
+ 0.34509803921568627
2237
+ ],
2238
+ "serializable": true,
2239
+ "bake": "live",
2240
+ "range": null,
2241
+ "options": null,
2242
+ "optionLabels": null,
2243
+ "optionDisabled": null
2244
+ },
2245
+ "pinShadow": {
2246
+ "id": "color.pinShadow",
2247
+ "group": "color",
2248
+ "key": "pinShadow",
2249
+ "label": "Pin Shadow",
2250
+ "description": "Use the explicit shadow tone below instead of deriving it.",
2251
+ "type": "boolean",
2252
+ "control": null,
2253
+ "defaultValue": false,
2254
+ "serializable": true,
2255
+ "bake": "live",
2256
+ "range": null,
2257
+ "options": null,
2258
+ "optionLabels": null,
2259
+ "optionDisabled": null
2260
+ },
2261
+ "shadow": {
2262
+ "id": "color.shadow",
2263
+ "group": "color",
2264
+ "key": "shadow",
2265
+ "label": "Shadow Tone",
2266
+ "description": "Shaded leaf tone (when pinned).",
2267
+ "type": "color",
2268
+ "control": null,
2269
+ "defaultValue": [
2270
+ 0.18,
2271
+ 0.42,
2272
+ 0.28
2273
+ ],
2274
+ "serializable": true,
2275
+ "bake": "live",
2276
+ "range": null,
2277
+ "options": null,
2278
+ "optionLabels": null,
2279
+ "optionDisabled": null
2280
+ },
2281
+ "pinCrown": {
2282
+ "id": "color.pinCrown",
2283
+ "group": "color",
2284
+ "key": "pinCrown",
2285
+ "label": "Pin Crown",
2286
+ "description": "Use the explicit crown-crest tone below instead of deriving it.",
2287
+ "type": "boolean",
2288
+ "control": null,
2289
+ "defaultValue": false,
2290
+ "serializable": true,
2291
+ "bake": "live",
2292
+ "range": null,
2293
+ "options": null,
2294
+ "optionLabels": null,
2295
+ "optionDisabled": null
2296
+ },
2297
+ "crown": {
2298
+ "id": "color.crown",
2299
+ "group": "color",
2300
+ "key": "crown",
2301
+ "label": "Crown Tone",
2302
+ "description": "Sun-struck crest tone on the crown top (when pinned).",
2303
+ "type": "color",
2304
+ "control": null,
2305
+ "defaultValue": [
2306
+ 0.55,
2307
+ 0.78,
2308
+ 0.42
2309
+ ],
2310
+ "serializable": true,
2311
+ "bake": "live",
2312
+ "range": null,
2313
+ "options": null,
2314
+ "optionLabels": null,
2315
+ "optionDisabled": null
2316
+ }
2317
+ },
2318
+ "wind": {
2319
+ "speed": {
2320
+ "id": "wind.speed",
2321
+ "group": "wind",
2322
+ "key": "speed",
2323
+ "label": "Wind Speed",
2324
+ "description": "How fast the leaf-card flutter oscillates.",
2325
+ "type": "number",
2326
+ "control": null,
2327
+ "defaultValue": 1,
2328
+ "serializable": true,
2329
+ "bake": "live",
2330
+ "range": {
2331
+ "max": 4,
2332
+ "min": 0,
2333
+ "step": 0.01
2334
+ },
2335
+ "options": null,
2336
+ "optionLabels": null,
2337
+ "optionDisabled": null
2338
+ },
2339
+ "strength": {
2340
+ "id": "wind.strength",
2341
+ "group": "wind",
2342
+ "key": "strength",
2343
+ "label": "Wind Strength",
2344
+ "description": "How far leaf cards sway with the wind.",
2345
+ "type": "number",
2346
+ "control": null,
2347
+ "defaultValue": 0.05,
2348
+ "serializable": true,
2349
+ "bake": "live",
2350
+ "range": {
2351
+ "max": 0.5,
2352
+ "min": 0,
2353
+ "step": 0.005
2354
+ },
2355
+ "options": null,
2356
+ "optionLabels": null,
2357
+ "optionDisabled": null
2358
+ },
2359
+ "heading": {
2360
+ "id": "wind.heading",
2361
+ "group": "wind",
2362
+ "key": "heading",
2363
+ "label": "Heading",
2364
+ "description": "Horizontal (XZ) heading the canopy flutter drifts toward.",
2365
+ "type": "number",
2366
+ "control": null,
2367
+ "defaultValue": 0.29,
2368
+ "serializable": true,
2369
+ "bake": "live",
2370
+ "range": {
2371
+ "min": 0,
2372
+ "max": 6.29,
2373
+ "step": 0.01
2374
+ },
2375
+ "options": null,
2376
+ "optionLabels": null,
2377
+ "optionDisabled": null
2378
+ }
2379
+ }
2380
+ }
2381
+ };