@threenative/terrain 0.0.0-stage → 0.1.2

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 (125) hide show
  1. package/AGENT_GUIDE.md +194 -0
  2. package/LICENSE +21 -0
  3. package/README.md +71 -2
  4. package/THIRD_PARTY_NOTICES.md +38 -0
  5. package/dist/editor/index.d.ts +231 -0
  6. package/dist/editor/index.js +5624 -0
  7. package/dist/editor/server.d.ts +3 -0
  8. package/dist/editor/server.js +3688 -0
  9. package/dist/editor/worker.d.ts +2 -0
  10. package/dist/editor/worker.js +2212 -0
  11. package/dist/export.d.ts +54 -0
  12. package/dist/export.js +297 -0
  13. package/dist/index.d.ts +335 -0
  14. package/dist/index.js +2927 -0
  15. package/dist/server-ByM2hmYJ.d.ts +630 -0
  16. package/dist/terrain-gPnkCU6S.d.ts +141 -0
  17. package/dist/three.d.ts +14 -0
  18. package/dist/three.js +40 -0
  19. package/dist/types-Ant8-Axc.d.ts +486 -0
  20. package/package.json +86 -3
  21. package/starter/alpine/README.md +29 -0
  22. package/starter/alpine/assets.json +12 -0
  23. package/starter/alpine/bake.mjs +118 -0
  24. package/starter/alpine/recipe.json +66167 -0
  25. package/starter/alpine/sky.ts +23 -0
  26. package/starter/alpine/surface.json +53 -0
  27. package/starter/alpine/world.ts +335 -0
  28. package/starter/coastal/README.md +37 -0
  29. package/starter/coastal/assets.json +10 -0
  30. package/starter/coastal/bake.mjs +118 -0
  31. package/starter/coastal/recipe.json +66161 -0
  32. package/starter/coastal/sea.ts +327 -0
  33. package/starter/coastal/sky.ts +24 -0
  34. package/starter/coastal/surface.json +41 -0
  35. package/starter/coastal/world.ts +386 -0
  36. package/starter/desert/README.md +35 -0
  37. package/starter/desert/assets.json +12 -0
  38. package/starter/desert/bake.mjs +118 -0
  39. package/starter/desert/recipe.json +66156 -0
  40. package/starter/desert/sky.ts +23 -0
  41. package/starter/desert/surface.json +54 -0
  42. package/starter/desert/world.ts +335 -0
  43. package/starter/forest/README.md +46 -0
  44. package/starter/forest/assets.json +32 -0
  45. package/starter/forest/bake.mjs +118 -0
  46. package/starter/forest/recipe.json +4586 -0
  47. package/starter/forest/sky.ts +27 -0
  48. package/starter/forest/surface.json +79 -0
  49. package/starter/forest/water.ts +266 -0
  50. package/starter/forest/world.ts +413 -0
  51. package/starter/tundra/README.md +29 -0
  52. package/starter/tundra/assets.json +12 -0
  53. package/starter/tundra/bake.mjs +118 -0
  54. package/starter/tundra/recipe.json +66325 -0
  55. package/starter/tundra/sky.ts +27 -0
  56. package/starter/tundra/surface.json +54 -0
  57. package/starter/tundra/water.ts +313 -0
  58. package/starter/tundra/world.ts +366 -0
  59. package/starter-assets/bark_brown_02/bark_brown_02_diff_1k.jpg +0 -0
  60. package/starter-assets/bark_brown_02/bark_brown_02_nor_gl_1k.jpg +0 -0
  61. package/starter-assets/bark_brown_02/bark_brown_02_rough_1k.jpg +0 -0
  62. package/starter-assets/boulder_01/boulder-mid.glb +0 -0
  63. package/starter-assets/boulder_01/boulder-near.glb +0 -0
  64. package/starter-assets/cliff_side/cliff_side_ao_1k.jpg +0 -0
  65. package/starter-assets/cliff_side/cliff_side_diff_1k.jpg +0 -0
  66. package/starter-assets/cliff_side/cliff_side_nor_gl_1k.jpg +0 -0
  67. package/starter-assets/cliff_side/cliff_side_rough_1k.jpg +0 -0
  68. package/starter-assets/credits.json +1022 -0
  69. package/starter-assets/fern_02/fern_02_alpha_512.png +0 -0
  70. package/starter-assets/fern_02/fern_02_diff_512.jpg +0 -0
  71. package/starter-assets/fern_02/fern_02_nor_gl_512.jpg +0 -0
  72. package/starter-assets/fir_tree_01/fir-b-lod1.glb +0 -0
  73. package/starter-assets/fir_tree_01/fir-b-lod2.glb +0 -0
  74. package/starter-assets/fir_tree_01/fir-c-lod1.glb +0 -0
  75. package/starter-assets/fir_tree_01/fir-c-lod2.glb +0 -0
  76. package/starter-assets/fir_tree_01/fir_tree_01_twig_arm_1k.jpg +0 -0
  77. package/starter-assets/fir_tree_01/fir_tree_01_twig_diff_1k.jpg +0 -0
  78. package/starter-assets/fir_tree_01/fir_tree_01_twig_nor_gl_1k.jpg +0 -0
  79. package/starter-assets/forest_ground_04/forest_ground_04_ao_1k.jpg +0 -0
  80. package/starter-assets/forest_ground_04/forest_ground_04_diff_1k.jpg +0 -0
  81. package/starter-assets/forest_ground_04/forest_ground_04_nor_gl_1k.jpg +0 -0
  82. package/starter-assets/forest_ground_04/forest_ground_04_rough_1k.jpg +0 -0
  83. package/starter-assets/forest_leaves_02/forest_leaves_02_arm_512.jpg +0 -0
  84. package/starter-assets/forest_leaves_02/forest_leaves_02_diff_512.jpg +0 -0
  85. package/starter-assets/forest_leaves_02/forest_leaves_02_nor_gl_512.jpg +0 -0
  86. package/starter-assets/grass_medium_02/grass_medium_02_alpha_512.png +0 -0
  87. package/starter-assets/grass_medium_02/grass_medium_02_diff_512.jpg +0 -0
  88. package/starter-assets/grass_medium_02/grass_medium_02_nor_gl_512.jpg +0 -0
  89. package/starter-assets/hdri/kloofendal_48d_partly_cloudy_1k.hdr +0 -0
  90. package/starter-assets/leafy_grass/leafy_grass_ao_1k.jpg +0 -0
  91. package/starter-assets/leafy_grass/leafy_grass_diff_1k.jpg +0 -0
  92. package/starter-assets/leafy_grass/leafy_grass_nor_gl_1k.jpg +0 -0
  93. package/starter-assets/leafy_grass/leafy_grass_rough_1k.jpg +0 -0
  94. package/starter-assets/lichen_rock/lichen_rock_arm_512.jpg +0 -0
  95. package/starter-assets/lichen_rock/lichen_rock_diff_512.jpg +0 -0
  96. package/starter-assets/lichen_rock/lichen_rock_nor_gl_512.jpg +0 -0
  97. package/starter-assets/mossy_rock/mossy_rock_ao_1k.jpg +0 -0
  98. package/starter-assets/mossy_rock/mossy_rock_diff_1k.jpg +0 -0
  99. package/starter-assets/mossy_rock/mossy_rock_nor_gl_1k.jpg +0 -0
  100. package/starter-assets/mossy_rock/mossy_rock_rough_1k.jpg +0 -0
  101. package/starter-assets/needle-atlas.png +0 -0
  102. package/starter-assets/needle-surface.png +0 -0
  103. package/starter-assets/river_small_rocks/river_small_rocks_arm_512.jpg +0 -0
  104. package/starter-assets/river_small_rocks/river_small_rocks_diff_512.jpg +0 -0
  105. package/starter-assets/river_small_rocks/river_small_rocks_nor_gl_512.jpg +0 -0
  106. package/starter-assets/rock_boulder_dry/rock_boulder_dry_arm_512.jpg +0 -0
  107. package/starter-assets/rock_boulder_dry/rock_boulder_dry_diff_512.jpg +0 -0
  108. package/starter-assets/rock_boulder_dry/rock_boulder_dry_nor_gl_512.jpg +0 -0
  109. package/starter-assets/rocks/boulder-mid.glb +0 -0
  110. package/starter-assets/rocks/boulder-near.glb +0 -0
  111. package/starter-assets/rocks/boulder-prep.json +37 -0
  112. package/starter-assets/rocks/rock01-mid.glb +0 -0
  113. package/starter-assets/rocks/rock01-near.glb +0 -0
  114. package/starter-assets/rocks/rock01-prep.json +37 -0
  115. package/starter-assets/rocks/rock04-mid.glb +0 -0
  116. package/starter-assets/rocks/rock04-near.glb +0 -0
  117. package/starter-assets/rocks/rock04-prep.json +37 -0
  118. package/starter-assets/sand_01/sand_01_ao_1k.jpg +0 -0
  119. package/starter-assets/sand_01/sand_01_diff_1k.jpg +0 -0
  120. package/starter-assets/sand_01/sand_01_nor_gl_1k.jpg +0 -0
  121. package/starter-assets/sand_01/sand_01_rough_1k.jpg +0 -0
  122. package/starter-assets/snow_02/snow_02_ao_1k.jpg +0 -0
  123. package/starter-assets/snow_02/snow_02_diff_1k.jpg +0 -0
  124. package/starter-assets/snow_02/snow_02_nor_gl_1k.jpg +0 -0
  125. package/starter-assets/snow_02/snow_02_rough_1k.jpg +0 -0
@@ -0,0 +1,1022 @@
1
+ {
2
+ "version": 1,
3
+ "purpose": "Prepared CC0 PBR surface maps for the five starter environments, Temperate first.",
4
+ "source": "Poly Haven",
5
+ "sourceUrl": "https://polyhaven.com",
6
+ "license": "CC0 1.0 Universal (public domain dedication)",
7
+ "licenseUrl": "https://polyhaven.com/license",
8
+ "redistribution": "permitted; attribution is not required and is recorded anyway",
9
+ "downloaded": "2026-10-01",
10
+ "resolution": "1K (1024x1024) JPEG, the upstream files byte for byte",
11
+ "preprocessing": "none. Every file is the upstream 1K JPG, verified byte-identical by sha256, at a dimension that is a multiple of 4 and at most 2048 so the same set can be recooked to BC7.",
12
+ "servedTo": "examples/strata-terrain-preview (vite publicDir), loaded through ctx.assets.texture()",
13
+ "cookedBytes": 23855553,
14
+ "cookedMiB": 22.75,
15
+ "cookedBudgetMiB": 25,
16
+ "sampledTexturesInGroundMaterial": 14,
17
+ "sampledTextureLimitPerStage": 16,
18
+ "sets": {
19
+ "leafy_grass": {
20
+ "asset": "Leafy Grass",
21
+ "author": "Charlotte Baglioni",
22
+ "license": "CC0",
23
+ "groundLayer": "grass",
24
+ "metresPerTile": 2.6,
25
+ "note": null
26
+ },
27
+ "forest_ground_04": {
28
+ "asset": "Forest Ground 04",
29
+ "author": "Rob Tuytel, Rico Cilliers",
30
+ "license": "CC0",
31
+ "groundLayer": "dirt",
32
+ "metresPerTile": 3.4,
33
+ "note": null
34
+ },
35
+ "cliff_side": {
36
+ "asset": "Cliff Side",
37
+ "author": "James Ray Cock, Jenelle van Heerden, Dario Barresi",
38
+ "license": "CC0",
39
+ "groundLayer": "rock",
40
+ "metresPerTile": 9.0,
41
+ "note": "The PRD shortlist names Sandstone Cracks for dry rock. Cliff Side is the same CC0 source's layered, sediment-banded rock face and is what the Temperate cliffs use; Sandstone Cracks stays unallocated for the Desert/Canyon starter."
42
+ },
43
+ "mossy_rock": {
44
+ "asset": "Mossy Rock",
45
+ "author": "Poly Haven / Dario Barresi",
46
+ "license": "CC0",
47
+ "groundLayer": "moss",
48
+ "metresPerTile": 3.6,
49
+ "note": "Substituted for the shortlist's Rock Moss Set 02: that set's 1K diffuse is an atlas of seven rocks over black unused cells with starburst edges, not a tileable ground map. Mossy Rock (CC0, Poly Haven) is tileable, mossy and stony."
50
+ },
51
+ "sand_01": {
52
+ "asset": "Sand 01",
53
+ "author": "Rob Tuytel",
54
+ "license": "CC0",
55
+ "groundLayer": "sand",
56
+ "metresPerTile": 3.2,
57
+ "note": "The 1K diffuse and GL normal map are seam-blended for tiling: each cross-fades its edges with a half-shifted copy. Diffuse left-right seam ratio 1.51 to 0.95; top-bottom 1.43 to 1.13. Only the edges changed; the source is Poly Haven, CC0."
58
+ },
59
+ "snow_02": {
60
+ "asset": "Snow 02",
61
+ "author": "Rob Tuytel",
62
+ "license": "CC0",
63
+ "groundLayer": "snow",
64
+ "metresPerTile": 12.0,
65
+ "note": null
66
+ },
67
+ "bark_brown_02": {
68
+ "asset": "Bark Brown 02",
69
+ "author": "Rob Tuytel",
70
+ "license": "CC0",
71
+ "groundLayer": null,
72
+ "metresPerTile": 1.6,
73
+ "note": "Spruce trunk bark. The shortlist names it for procedural tree bark; the Temperate starter uses it on the tapered spruce trunk, tiled 1.6 m up a 14 m trunk, and nowhere else."
74
+ },
75
+ "rock_boulder_dry": {
76
+ "asset": "Rock Boulder Dry",
77
+ "author": "Dimitrios Savva (Photography), Rico Cilliers (Processing)",
78
+ "license": "CC0",
79
+ "groundLayer": null,
80
+ "metresPerTile": null,
81
+ "note": "The dry grey granite-ish boulder set. Its 1K diffuse is tileable stone, not an atlas: the seam column differs from the last by 5.7 grey levels against an interior neighbour difference of 7.5, so it wraps as well as the map averages."
82
+ },
83
+ "lichen_rock": {
84
+ "asset": "Lichen Rock",
85
+ "author": "Rico Cilliers (All)",
86
+ "license": "CC0",
87
+ "groundLayer": null,
88
+ "metresPerTile": null,
89
+ "note": "The lichen-crusted weathered boulder set. Seam 11.5 against an interior 12.1: tileable. Distinct from the existing mossy_rock set, which is moss rather than lichen, so a boulder bed does not read as one surface twice."
90
+ },
91
+ "forest_leaves_02": {
92
+ "asset": "Forest Leaves 02",
93
+ "author": "Rob Tuytel (All)",
94
+ "license": "CC0",
95
+ "groundLayer": null,
96
+ "metresPerTile": null,
97
+ "note": "Leaf litter and forest floor for the ground under trees. Seam 19.7 against an interior 17.2: tileable. metresPerTile is deliberately null: the tiling is the terrain render layer's choice, not this folder's."
98
+ },
99
+ "river_small_rocks": {
100
+ "asset": "River Small Rocks",
101
+ "author": "Rob Tuytel (Photography, Processing), Rico Cilliers (Minor adjustment)",
102
+ "license": "CC0",
103
+ "groundLayer": null,
104
+ "metresPerTile": null,
105
+ "note": "The pebble set for river banks. Seam 12.6 against an interior 11.2: tileable. metresPerTile is deliberately null, as above."
106
+ },
107
+ "fern_02": {
108
+ "asset": "Fern 02",
109
+ "author": "Rob Tuytel, Rico Cilliers",
110
+ "license": "CC0",
111
+ "groundLayer": null,
112
+ "metresPerTile": null,
113
+ "note": "Alpha-cut card atlas only (diffuse, alpha, OpenGL normal at 512 px). The upstream plant meshes are not shipped: cut to the starter budget they kept one blade or frond of each plant, so the game builds its own cards on this atlas."
114
+ },
115
+ "grass_medium_02": {
116
+ "asset": "Grass Medium 02",
117
+ "author": "Rob Tuytel (photography), Rico Cilliers (modeling)",
118
+ "license": "CC0",
119
+ "groundLayer": null,
120
+ "metresPerTile": null,
121
+ "note": "Alpha-cut card atlas only (diffuse, alpha, OpenGL normal at 512 px). The upstream plant meshes are not shipped: cut to the starter budget they kept one blade or frond of each plant, so the game builds its own cards on this atlas."
122
+ }
123
+ },
124
+ "files": [
125
+ {
126
+ "set": "bark_brown_02",
127
+ "asset": "Bark Brown 02",
128
+ "author": "Rob Tuytel",
129
+ "license": "CC0",
130
+ "map": "diff",
131
+ "file": "bark_brown_02/bark_brown_02_diff_1k.jpg",
132
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/bark_brown_02/bark_brown_02_diff_1k.jpg",
133
+ "bytes": 659592,
134
+ "dimensions": "1024x1024",
135
+ "colourSpace": "srgb",
136
+ "metresPerTile": 1.6,
137
+ "groundLayer": null,
138
+ "sampledByTemperateGround": false,
139
+ "sha256": "920fa0bed0c9d78c1d530e99795113afd532d7db746de440f4a85d7c83ed0f1a"
140
+ },
141
+ {
142
+ "set": "bark_brown_02",
143
+ "asset": "Bark Brown 02",
144
+ "author": "Rob Tuytel",
145
+ "license": "CC0",
146
+ "map": "nor_gl",
147
+ "file": "bark_brown_02/bark_brown_02_nor_gl_1k.jpg",
148
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/bark_brown_02/bark_brown_02_nor_gl_1k.jpg",
149
+ "bytes": 1015623,
150
+ "dimensions": "1024x1024",
151
+ "colourSpace": "linear",
152
+ "metresPerTile": 1.6,
153
+ "groundLayer": null,
154
+ "sampledByTemperateGround": false,
155
+ "sha256": "0d5e691e8ad8bcd093a3587887fda2a6b4a948b5708a4f256f7919584c6eb857"
156
+ },
157
+ {
158
+ "set": "bark_brown_02",
159
+ "asset": "Bark Brown 02",
160
+ "author": "Rob Tuytel",
161
+ "license": "CC0",
162
+ "map": "rough",
163
+ "file": "bark_brown_02/bark_brown_02_rough_1k.jpg",
164
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/bark_brown_02/bark_brown_02_rough_1k.jpg",
165
+ "bytes": 337946,
166
+ "dimensions": "1024x1024",
167
+ "colourSpace": "linear",
168
+ "metresPerTile": 1.6,
169
+ "groundLayer": null,
170
+ "sampledByTemperateGround": false,
171
+ "sha256": "68125592de36e15bae7aa6db85c4d135aeb7e5653199ba226483a70f6d69837d"
172
+ },
173
+ {
174
+ "set": "cliff_side",
175
+ "asset": "Cliff Side",
176
+ "author": "James Ray Cock, Jenelle van Heerden, Dario Barresi",
177
+ "license": "CC0",
178
+ "map": "ao",
179
+ "file": "cliff_side/cliff_side_ao_1k.jpg",
180
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/cliff_side/cliff_side_ao_1k.jpg",
181
+ "bytes": 412993,
182
+ "dimensions": "1024x1024",
183
+ "colourSpace": "linear",
184
+ "metresPerTile": 9.0,
185
+ "groundLayer": "rock",
186
+ "sampledByTemperateGround": true,
187
+ "sha256": "726a57a786c5130a8bcb7c78d81657b68652dd4ee424a7e4683225cfdbb00dfc"
188
+ },
189
+ {
190
+ "set": "cliff_side",
191
+ "asset": "Cliff Side",
192
+ "author": "James Ray Cock, Jenelle van Heerden, Dario Barresi",
193
+ "license": "CC0",
194
+ "map": "diff",
195
+ "file": "cliff_side/cliff_side_diff_1k.jpg",
196
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/cliff_side/cliff_side_diff_1k.jpg",
197
+ "bytes": 859756,
198
+ "dimensions": "1024x1024",
199
+ "colourSpace": "srgb",
200
+ "metresPerTile": 9.0,
201
+ "groundLayer": "rock",
202
+ "sampledByTemperateGround": true,
203
+ "sha256": "5c6858541108fc34e5726ecf4d8d942d6301155c489e7341619260f2909570c5"
204
+ },
205
+ {
206
+ "set": "cliff_side",
207
+ "asset": "Cliff Side",
208
+ "author": "James Ray Cock, Jenelle van Heerden, Dario Barresi",
209
+ "license": "CC0",
210
+ "map": "nor_gl",
211
+ "file": "cliff_side/cliff_side_nor_gl_1k.jpg",
212
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/cliff_side/cliff_side_nor_gl_1k.jpg",
213
+ "bytes": 1007837,
214
+ "dimensions": "1024x1024",
215
+ "colourSpace": "linear",
216
+ "metresPerTile": 9.0,
217
+ "groundLayer": "rock",
218
+ "sampledByTemperateGround": true,
219
+ "sha256": "28583860810a7d6d8ffddeaaff463408fc580338fd5a92c67b058207e75375a3"
220
+ },
221
+ {
222
+ "set": "cliff_side",
223
+ "asset": "Cliff Side",
224
+ "author": "James Ray Cock, Jenelle van Heerden, Dario Barresi",
225
+ "license": "CC0",
226
+ "map": "rough",
227
+ "file": "cliff_side/cliff_side_rough_1k.jpg",
228
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/cliff_side/cliff_side_rough_1k.jpg",
229
+ "bytes": 422579,
230
+ "dimensions": "1024x1024",
231
+ "colourSpace": "linear",
232
+ "metresPerTile": 9.0,
233
+ "groundLayer": "rock",
234
+ "sampledByTemperateGround": true,
235
+ "sha256": "9d62079c5fc52d1a0dc659d2ad7f807e489dea18b5cb1a130bcea276fdc9f550"
236
+ },
237
+ {
238
+ "set": "forest_ground_04",
239
+ "asset": "Forest Ground 04",
240
+ "author": "Rob Tuytel, Rico Cilliers",
241
+ "license": "CC0",
242
+ "map": "ao",
243
+ "file": "forest_ground_04/forest_ground_04_ao_1k.jpg",
244
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/forest_ground_04/forest_ground_04_ao_1k.jpg",
245
+ "bytes": 831864,
246
+ "dimensions": "1024x1024",
247
+ "colourSpace": "linear",
248
+ "metresPerTile": 3.4,
249
+ "groundLayer": "dirt",
250
+ "sampledByTemperateGround": false,
251
+ "sha256": "d948c7578a122fdb592d9fda5de01746a9f567e0f2981bc7f89d3358422d0ad1"
252
+ },
253
+ {
254
+ "set": "forest_ground_04",
255
+ "asset": "Forest Ground 04",
256
+ "author": "Rob Tuytel, Rico Cilliers",
257
+ "license": "CC0",
258
+ "map": "diff",
259
+ "file": "forest_ground_04/forest_ground_04_diff_1k.jpg",
260
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/forest_ground_04/forest_ground_04_diff_1k.jpg",
261
+ "bytes": 1113899,
262
+ "dimensions": "1024x1024",
263
+ "colourSpace": "srgb",
264
+ "metresPerTile": 3.4,
265
+ "groundLayer": "dirt",
266
+ "sampledByTemperateGround": true,
267
+ "sha256": "50a4dda30875020c64385261aa7e00e2155b592302fa6794165f58fae73cbd2c"
268
+ },
269
+ {
270
+ "set": "forest_ground_04",
271
+ "asset": "Forest Ground 04",
272
+ "author": "Rob Tuytel, Rico Cilliers",
273
+ "license": "CC0",
274
+ "map": "nor_gl",
275
+ "file": "forest_ground_04/forest_ground_04_nor_gl_1k.jpg",
276
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/forest_ground_04/forest_ground_04_nor_gl_1k.jpg",
277
+ "bytes": 1326812,
278
+ "dimensions": "1024x1024",
279
+ "colourSpace": "linear",
280
+ "metresPerTile": 3.4,
281
+ "groundLayer": "dirt",
282
+ "sampledByTemperateGround": true,
283
+ "sha256": "9c3a0200e02ce40edffbbf9f5f623ef08ea9b1b7812b556182ec978f88887151"
284
+ },
285
+ {
286
+ "set": "forest_ground_04",
287
+ "asset": "Forest Ground 04",
288
+ "author": "Rob Tuytel, Rico Cilliers",
289
+ "license": "CC0",
290
+ "map": "rough",
291
+ "file": "forest_ground_04/forest_ground_04_rough_1k.jpg",
292
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/forest_ground_04/forest_ground_04_rough_1k.jpg",
293
+ "bytes": 627507,
294
+ "dimensions": "1024x1024",
295
+ "colourSpace": "linear",
296
+ "metresPerTile": 3.4,
297
+ "groundLayer": "dirt",
298
+ "sampledByTemperateGround": false,
299
+ "sha256": "89d4d50395eb92824a64132c4bc8a5a09009071e0b325ab66dc3104c7a3090ed"
300
+ },
301
+ {
302
+ "set": "leafy_grass",
303
+ "asset": "Leafy Grass",
304
+ "author": "Charlotte Baglioni",
305
+ "license": "CC0",
306
+ "map": "ao",
307
+ "file": "leafy_grass/leafy_grass_ao_1k.jpg",
308
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/leafy_grass/leafy_grass_ao_1k.jpg",
309
+ "bytes": 1056302,
310
+ "dimensions": "1024x1024",
311
+ "colourSpace": "linear",
312
+ "metresPerTile": 2.6,
313
+ "groundLayer": "grass",
314
+ "sampledByTemperateGround": true,
315
+ "sha256": "0a53eeb9a89531b5d2ceb42f5d86f320396612844dc376c8f0d6d93d6e14cefa"
316
+ },
317
+ {
318
+ "set": "leafy_grass",
319
+ "asset": "Leafy Grass",
320
+ "author": "Charlotte Baglioni",
321
+ "license": "CC0",
322
+ "map": "diff",
323
+ "file": "leafy_grass/leafy_grass_diff_1k.jpg",
324
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/leafy_grass/leafy_grass_diff_1k.jpg",
325
+ "bytes": 1195394,
326
+ "dimensions": "1024x1024",
327
+ "colourSpace": "srgb",
328
+ "metresPerTile": 2.6,
329
+ "groundLayer": "grass",
330
+ "sampledByTemperateGround": true,
331
+ "sha256": "cfa40bc9d9417d1852db8753a8d5917f110c40101179f63543c382e39bc05e4a"
332
+ },
333
+ {
334
+ "set": "leafy_grass",
335
+ "asset": "Leafy Grass",
336
+ "author": "Charlotte Baglioni",
337
+ "license": "CC0",
338
+ "map": "nor_gl",
339
+ "file": "leafy_grass/leafy_grass_nor_gl_1k.jpg",
340
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/leafy_grass/leafy_grass_nor_gl_1k.jpg",
341
+ "bytes": 1466049,
342
+ "dimensions": "1024x1024",
343
+ "colourSpace": "linear",
344
+ "metresPerTile": 2.6,
345
+ "groundLayer": "grass",
346
+ "sampledByTemperateGround": true,
347
+ "sha256": "832328216adc0a7e1f70a31d5ee48c9ab7f2152d83816122736cf42ac4b2ebd6"
348
+ },
349
+ {
350
+ "set": "leafy_grass",
351
+ "asset": "Leafy Grass",
352
+ "author": "Charlotte Baglioni",
353
+ "license": "CC0",
354
+ "map": "rough",
355
+ "file": "leafy_grass/leafy_grass_rough_1k.jpg",
356
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/leafy_grass/leafy_grass_rough_1k.jpg",
357
+ "bytes": 511385,
358
+ "dimensions": "1024x1024",
359
+ "colourSpace": "linear",
360
+ "metresPerTile": 2.6,
361
+ "groundLayer": "grass",
362
+ "sampledByTemperateGround": true,
363
+ "sha256": "0c2a1d91aacb8e54a496051b59854e51e456fe858abeade778e308359ef16463"
364
+ },
365
+ {
366
+ "set": "mossy_rock",
367
+ "asset": "Mossy Rock",
368
+ "author": "Poly Haven / Dario Barresi",
369
+ "license": "CC0",
370
+ "map": "ao",
371
+ "file": "mossy_rock/mossy_rock_ao_1k.jpg",
372
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/mossy_rock/mossy_rock_ao_1k.jpg",
373
+ "bytes": 533103,
374
+ "dimensions": "1024x1024",
375
+ "colourSpace": "linear",
376
+ "metresPerTile": 3.6,
377
+ "groundLayer": "moss",
378
+ "sampledByTemperateGround": false,
379
+ "sha256": "00856838c04dfc778dd830d6e92d0f77effb8286c32d8068f2cf48a02a31cdaa"
380
+ },
381
+ {
382
+ "set": "mossy_rock",
383
+ "asset": "Mossy Rock",
384
+ "author": "Poly Haven / Dario Barresi",
385
+ "license": "CC0",
386
+ "map": "diff",
387
+ "file": "mossy_rock/mossy_rock_diff_1k.jpg",
388
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/mossy_rock/mossy_rock_diff_1k.jpg",
389
+ "bytes": 1124438,
390
+ "dimensions": "1024x1024",
391
+ "colourSpace": "srgb",
392
+ "metresPerTile": 3.6,
393
+ "groundLayer": "moss",
394
+ "sampledByTemperateGround": true,
395
+ "sha256": "4dbf37f1b0465c9c8914213163923be159716f5b97fb6946437b6c5e143ef540"
396
+ },
397
+ {
398
+ "set": "mossy_rock",
399
+ "asset": "Mossy Rock",
400
+ "author": "Poly Haven / Dario Barresi",
401
+ "license": "CC0",
402
+ "map": "nor_gl",
403
+ "file": "mossy_rock/mossy_rock_nor_gl_1k.jpg",
404
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/mossy_rock/mossy_rock_nor_gl_1k.jpg",
405
+ "bytes": 995727,
406
+ "dimensions": "1024x1024",
407
+ "colourSpace": "linear",
408
+ "metresPerTile": 3.6,
409
+ "groundLayer": "moss",
410
+ "sampledByTemperateGround": true,
411
+ "sha256": "232cdd6a9fdfd01bb8bb1f8f604c53dbca79fa0d3d7995edf85c9945757aa8df"
412
+ },
413
+ {
414
+ "set": "mossy_rock",
415
+ "asset": "Mossy Rock",
416
+ "author": "Poly Haven / Dario Barresi",
417
+ "license": "CC0",
418
+ "map": "rough",
419
+ "file": "mossy_rock/mossy_rock_rough_1k.jpg",
420
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/mossy_rock/mossy_rock_rough_1k.jpg",
421
+ "bytes": 780918,
422
+ "dimensions": "1024x1024",
423
+ "colourSpace": "linear",
424
+ "metresPerTile": 3.6,
425
+ "groundLayer": "moss",
426
+ "sampledByTemperateGround": false,
427
+ "sha256": "0a18bdeb08444b730170b0477f13940ce6cd4d82d06137df661f96d1e2a6a66e"
428
+ },
429
+ {
430
+ "set": "sand_01",
431
+ "asset": "Sand 01",
432
+ "author": "Rob Tuytel",
433
+ "license": "CC0",
434
+ "map": "ao",
435
+ "file": "sand_01/sand_01_ao_1k.jpg",
436
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/sand_01/sand_01_ao_1k.jpg",
437
+ "bytes": 298726,
438
+ "dimensions": "1024x1024",
439
+ "colourSpace": "linear",
440
+ "metresPerTile": 3.2,
441
+ "groundLayer": "sand",
442
+ "sampledByTemperateGround": false,
443
+ "sha256": "be5fed35a2b259088682241ce4cf1eb0ee5d36b820f520e3f5e7f353bd1f627a"
444
+ },
445
+ {
446
+ "set": "sand_01",
447
+ "asset": "Sand 01",
448
+ "author": "Rob Tuytel",
449
+ "license": "CC0",
450
+ "map": "diff",
451
+ "file": "sand_01/sand_01_diff_1k.jpg",
452
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/sand_01/sand_01_diff_1k.jpg",
453
+ "bytes": 485088,
454
+ "dimensions": "1024x1024",
455
+ "colourSpace": "srgb",
456
+ "metresPerTile": 3.2,
457
+ "groundLayer": "sand",
458
+ "sampledByTemperateGround": true,
459
+ "sha256": "a73b90eaa6d675ef57e7d48a8cf23e1f412e353ab2e29cf73930b8ecd4e76875"
460
+ },
461
+ {
462
+ "set": "sand_01",
463
+ "asset": "Sand 01",
464
+ "author": "Rob Tuytel",
465
+ "license": "CC0",
466
+ "map": "nor_gl",
467
+ "file": "sand_01/sand_01_nor_gl_1k.jpg",
468
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/sand_01/sand_01_nor_gl_1k.jpg",
469
+ "bytes": 877821,
470
+ "dimensions": "1024x1024",
471
+ "colourSpace": "linear",
472
+ "metresPerTile": 3.2,
473
+ "groundLayer": "sand",
474
+ "sampledByTemperateGround": false,
475
+ "sha256": "73984aecdc35b1ffbc322d64b7f8d8165b06970d11f37dd47010609fcb532704"
476
+ },
477
+ {
478
+ "set": "sand_01",
479
+ "asset": "Sand 01",
480
+ "author": "Rob Tuytel",
481
+ "license": "CC0",
482
+ "map": "rough",
483
+ "file": "sand_01/sand_01_rough_1k.jpg",
484
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/sand_01/sand_01_rough_1k.jpg",
485
+ "bytes": 189667,
486
+ "dimensions": "1024x1024",
487
+ "colourSpace": "linear",
488
+ "metresPerTile": 3.2,
489
+ "groundLayer": "sand",
490
+ "sampledByTemperateGround": false,
491
+ "sha256": "ccb179b12c56a9032d60e4f4e2da690b3612a58e1784eb14576372690cdcd1cb"
492
+ },
493
+ {
494
+ "set": "snow_02",
495
+ "asset": "Snow 02",
496
+ "author": "Rob Tuytel",
497
+ "license": "CC0",
498
+ "map": "ao",
499
+ "file": "snow_02/snow_02_ao_1k.jpg",
500
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/snow_02/snow_02_ao_1k.jpg",
501
+ "bytes": 289832,
502
+ "dimensions": "1024x1024",
503
+ "colourSpace": "linear",
504
+ "metresPerTile": 12.0,
505
+ "groundLayer": "snow",
506
+ "sampledByTemperateGround": false,
507
+ "sha256": "1be6441229c6db11ca39068e46eb4275e33d9c99f8e15d7a5b53d95c47e10ff6"
508
+ },
509
+ {
510
+ "set": "snow_02",
511
+ "asset": "Snow 02",
512
+ "author": "Rob Tuytel",
513
+ "license": "CC0",
514
+ "map": "diff",
515
+ "file": "snow_02/snow_02_diff_1k.jpg",
516
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/snow_02/snow_02_diff_1k.jpg",
517
+ "bytes": 325497,
518
+ "dimensions": "1024x1024",
519
+ "colourSpace": "srgb",
520
+ "metresPerTile": 12.0,
521
+ "groundLayer": "snow",
522
+ "sampledByTemperateGround": true,
523
+ "sha256": "523a4e69c90b96d787dd69b897f29a2b3761a017024405c60aa630d1e8e9009a"
524
+ },
525
+ {
526
+ "set": "snow_02",
527
+ "asset": "Snow 02",
528
+ "author": "Rob Tuytel",
529
+ "license": "CC0",
530
+ "map": "nor_gl",
531
+ "file": "snow_02/snow_02_nor_gl_1k.jpg",
532
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/snow_02/snow_02_nor_gl_1k.jpg",
533
+ "bytes": 1081858,
534
+ "dimensions": "1024x1024",
535
+ "colourSpace": "linear",
536
+ "metresPerTile": 12.0,
537
+ "groundLayer": "snow",
538
+ "sampledByTemperateGround": false,
539
+ "sha256": "9495ec680616b8340e2cbecbd151bff84c690cfad4209e90cc98d2d0ba81f810"
540
+ },
541
+ {
542
+ "set": "snow_02",
543
+ "asset": "Snow 02",
544
+ "author": "Rob Tuytel",
545
+ "license": "CC0",
546
+ "map": "rough",
547
+ "file": "snow_02/snow_02_rough_1k.jpg",
548
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/snow_02/snow_02_rough_1k.jpg",
549
+ "bytes": 146089,
550
+ "dimensions": "1024x1024",
551
+ "colourSpace": "linear",
552
+ "metresPerTile": 12.0,
553
+ "groundLayer": "snow",
554
+ "sampledByTemperateGround": false,
555
+ "sha256": "b6dea8039ac2a5beaed6fd41834fb55540cc76b492edd1d48ba2da2f30f1cb75"
556
+ },
557
+ {
558
+ "set": "rock_boulder_dry",
559
+ "asset": "Rock Boulder Dry",
560
+ "author": "Dimitrios Savva (Photography), Rico Cilliers (Processing)",
561
+ "license": "CC0",
562
+ "map": "diff",
563
+ "file": "rock_boulder_dry/rock_boulder_dry_diff_512.jpg",
564
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/rock_boulder_dry/rock_boulder_dry_diff_1k.jpg",
565
+ "bytes": 87707,
566
+ "dimensions": "512x512",
567
+ "colourSpace": "srgb",
568
+ "metresPerTile": null,
569
+ "groundLayer": null,
570
+ "sampledByTemperateGround": false,
571
+ "sha256": "dde5d4cf88dce2a3bcde0490c509f0a5f375c4aa002aa08f96afa6e0fb4f6c7b"
572
+ },
573
+ {
574
+ "set": "rock_boulder_dry",
575
+ "asset": "Rock Boulder Dry",
576
+ "author": "Dimitrios Savva (Photography), Rico Cilliers (Processing)",
577
+ "license": "CC0",
578
+ "map": "nor_gl",
579
+ "file": "rock_boulder_dry/rock_boulder_dry_nor_gl_512.jpg",
580
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/rock_boulder_dry/rock_boulder_dry_nor_gl_1k.jpg",
581
+ "bytes": 60524,
582
+ "dimensions": "512x512",
583
+ "colourSpace": "linear",
584
+ "metresPerTile": null,
585
+ "groundLayer": null,
586
+ "sampledByTemperateGround": false,
587
+ "sha256": "5039f885b242fdb9f4b15b1cde8d09dca53ec50d37544ffb72154505ba2fc136"
588
+ },
589
+ {
590
+ "set": "rock_boulder_dry",
591
+ "asset": "Rock Boulder Dry",
592
+ "author": "Dimitrios Savva (Photography), Rico Cilliers (Processing)",
593
+ "license": "CC0",
594
+ "map": "arm",
595
+ "file": "rock_boulder_dry/rock_boulder_dry_arm_512.jpg",
596
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/rock_boulder_dry/rock_boulder_dry_arm_1k.jpg",
597
+ "bytes": 60580,
598
+ "dimensions": "512x512",
599
+ "colourSpace": "linear",
600
+ "metresPerTile": null,
601
+ "groundLayer": null,
602
+ "sampledByTemperateGround": false,
603
+ "sha256": "6104415f2825ae7d0d072e8cd37b968324bb88b936665fbb73a71bda82a9a2a3"
604
+ },
605
+ {
606
+ "set": "lichen_rock",
607
+ "asset": "Lichen Rock",
608
+ "author": "Rico Cilliers (All)",
609
+ "license": "CC0",
610
+ "map": "diff",
611
+ "file": "lichen_rock/lichen_rock_diff_512.jpg",
612
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/lichen_rock/lichen_rock_diff_1k.jpg",
613
+ "bytes": 120954,
614
+ "dimensions": "512x512",
615
+ "colourSpace": "srgb",
616
+ "metresPerTile": null,
617
+ "groundLayer": null,
618
+ "sampledByTemperateGround": false,
619
+ "sha256": "fa16d72ea9a04d71e0a4e4b2c65ba50b59fe0f4dfb31838055a9eaa7b98f0244"
620
+ },
621
+ {
622
+ "set": "lichen_rock",
623
+ "asset": "Lichen Rock",
624
+ "author": "Rico Cilliers (All)",
625
+ "license": "CC0",
626
+ "map": "nor_gl",
627
+ "file": "lichen_rock/lichen_rock_nor_gl_512.jpg",
628
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/lichen_rock/lichen_rock_nor_gl_1k.jpg",
629
+ "bytes": 125051,
630
+ "dimensions": "512x512",
631
+ "colourSpace": "linear",
632
+ "metresPerTile": null,
633
+ "groundLayer": null,
634
+ "sampledByTemperateGround": false,
635
+ "sha256": "f6f0bb9f6546251851395582b9703df4ce9e0116d56fdd0cacc3b05a3aef3ee6"
636
+ },
637
+ {
638
+ "set": "lichen_rock",
639
+ "asset": "Lichen Rock",
640
+ "author": "Rico Cilliers (All)",
641
+ "license": "CC0",
642
+ "map": "arm",
643
+ "file": "lichen_rock/lichen_rock_arm_512.jpg",
644
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/lichen_rock/lichen_rock_arm_1k.jpg",
645
+ "bytes": 64088,
646
+ "dimensions": "512x512",
647
+ "colourSpace": "linear",
648
+ "metresPerTile": null,
649
+ "groundLayer": null,
650
+ "sampledByTemperateGround": false,
651
+ "sha256": "cccadfc7b806a15bd396cc433175c80fdb386009674726a8a17e48ba50ce50cb"
652
+ },
653
+ {
654
+ "set": "forest_leaves_02",
655
+ "asset": "Forest Leaves 02",
656
+ "author": "Rob Tuytel (All)",
657
+ "license": "CC0",
658
+ "map": "diff",
659
+ "file": "forest_leaves_02/forest_leaves_02_diff_512.jpg",
660
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/forest_leaves_02/forest_leaves_02_diffuse_1k.jpg",
661
+ "bytes": 131897,
662
+ "dimensions": "512x512",
663
+ "colourSpace": "srgb",
664
+ "metresPerTile": null,
665
+ "groundLayer": null,
666
+ "sampledByTemperateGround": false,
667
+ "sha256": "3041025c2bb5c57530d2e611618d8f8bcf75f54cd1a092f323fdc87520f6e2d0"
668
+ },
669
+ {
670
+ "set": "forest_leaves_02",
671
+ "asset": "Forest Leaves 02",
672
+ "author": "Rob Tuytel (All)",
673
+ "license": "CC0",
674
+ "map": "nor_gl",
675
+ "file": "forest_leaves_02/forest_leaves_02_nor_gl_512.jpg",
676
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/forest_leaves_02/forest_leaves_02_nor_gl_1k.jpg",
677
+ "bytes": 155946,
678
+ "dimensions": "512x512",
679
+ "colourSpace": "linear",
680
+ "metresPerTile": null,
681
+ "groundLayer": null,
682
+ "sampledByTemperateGround": false,
683
+ "sha256": "248afab4b44e078501a2363856e679909560a70587c1314a1c17f3f8063218ba"
684
+ },
685
+ {
686
+ "set": "forest_leaves_02",
687
+ "asset": "Forest Leaves 02",
688
+ "author": "Rob Tuytel (All)",
689
+ "license": "CC0",
690
+ "map": "arm",
691
+ "file": "forest_leaves_02/forest_leaves_02_arm_512.jpg",
692
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/forest_leaves_02/forest_leaves_02_arm_1k.jpg",
693
+ "bytes": 105808,
694
+ "dimensions": "512x512",
695
+ "colourSpace": "linear",
696
+ "metresPerTile": null,
697
+ "groundLayer": null,
698
+ "sampledByTemperateGround": false,
699
+ "sha256": "415b28f50e5bca6ef188dee4c9a66a4e2e6668bb909c310e0cb596f746f297cd"
700
+ },
701
+ {
702
+ "set": "river_small_rocks",
703
+ "asset": "River Small Rocks",
704
+ "author": "Rob Tuytel (Photography, Processing), Rico Cilliers (Minor adjustment)",
705
+ "license": "CC0",
706
+ "map": "diff",
707
+ "file": "river_small_rocks/river_small_rocks_diff_512.jpg",
708
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/river_small_rocks/river_small_rocks_diff_1k.jpg",
709
+ "bytes": 104165,
710
+ "dimensions": "512x512",
711
+ "colourSpace": "srgb",
712
+ "metresPerTile": null,
713
+ "groundLayer": null,
714
+ "sampledByTemperateGround": false,
715
+ "sha256": "b4dc4bd921c9d22b2dcb33984527032e897ca98a09bf63c13caff6787485c3c0"
716
+ },
717
+ {
718
+ "set": "river_small_rocks",
719
+ "asset": "River Small Rocks",
720
+ "author": "Rob Tuytel (Photography, Processing), Rico Cilliers (Minor adjustment)",
721
+ "license": "CC0",
722
+ "map": "nor_gl",
723
+ "file": "river_small_rocks/river_small_rocks_nor_gl_512.jpg",
724
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/river_small_rocks/river_small_rocks_nor_gl_1k.jpg",
725
+ "bytes": 153457,
726
+ "dimensions": "512x512",
727
+ "colourSpace": "linear",
728
+ "metresPerTile": null,
729
+ "groundLayer": null,
730
+ "sampledByTemperateGround": false,
731
+ "sha256": "5acd5993c4ce8cc32778ca57f210c538a676020971240306a2ab2438158e5d89"
732
+ },
733
+ {
734
+ "set": "river_small_rocks",
735
+ "asset": "River Small Rocks",
736
+ "author": "Rob Tuytel (Photography, Processing), Rico Cilliers (Minor adjustment)",
737
+ "license": "CC0",
738
+ "map": "arm",
739
+ "file": "river_small_rocks/river_small_rocks_arm_512.jpg",
740
+ "url": "https://dl.polyhaven.org/file/ph-assets/Textures/jpg/1k/river_small_rocks/river_small_rocks_arm_1k.jpg",
741
+ "bytes": 89842,
742
+ "dimensions": "512x512",
743
+ "colourSpace": "linear",
744
+ "metresPerTile": null,
745
+ "groundLayer": null,
746
+ "sampledByTemperateGround": false,
747
+ "sha256": "5d413aee3dc1e416e451788d9e671d6aa8e2436569156eb3f9f55620d7f670f9"
748
+ },
749
+ {
750
+ "set": "fern_02",
751
+ "asset": "Fern 02",
752
+ "author": "Rob Tuytel, Rico Cilliers",
753
+ "license": "CC0",
754
+ "map": "alpha",
755
+ "file": "fern_02/fern_02_alpha_512.png",
756
+ "url": "https://polyhaven.com/a/fern_02",
757
+ "bytes": 41735,
758
+ "dimensions": [512, 512],
759
+ "sha256": "d3422b26b0f41a0be9d5e7d7878765da674ff173f4c5a0c47795364c8b954bb0"
760
+ },
761
+ {
762
+ "set": "fern_02",
763
+ "asset": "Fern 02",
764
+ "author": "Rob Tuytel, Rico Cilliers",
765
+ "license": "CC0",
766
+ "map": "diff",
767
+ "file": "fern_02/fern_02_diff_512.jpg",
768
+ "url": "https://polyhaven.com/a/fern_02",
769
+ "bytes": 33569,
770
+ "dimensions": [512, 512],
771
+ "sha256": "a6047726852171297213cb8063c1607856b0c414c579ff9d60a54262b925f78a"
772
+ },
773
+ {
774
+ "set": "fern_02",
775
+ "asset": "Fern 02",
776
+ "author": "Rob Tuytel, Rico Cilliers",
777
+ "license": "CC0",
778
+ "map": "nor_gl",
779
+ "file": "fern_02/fern_02_nor_gl_512.jpg",
780
+ "url": "https://polyhaven.com/a/fern_02",
781
+ "bytes": 35095,
782
+ "dimensions": [512, 512],
783
+ "sha256": "72d64f5a9632cf5cc26969b8e60b1a5da5432bbde562b87a6fccef29949e28a8"
784
+ },
785
+ {
786
+ "set": "grass_medium_02",
787
+ "asset": "Grass Medium 02",
788
+ "author": "Rob Tuytel (photography), Rico Cilliers (modeling)",
789
+ "license": "CC0",
790
+ "map": "alpha",
791
+ "file": "grass_medium_02/grass_medium_02_alpha_512.png",
792
+ "url": "https://polyhaven.com/a/grass_medium_02",
793
+ "bytes": 24268,
794
+ "dimensions": [512, 512],
795
+ "sha256": "4f94afff57290dae13e02ea16742ec2fa446f7c596f71eb44da6e92f5b2e17ad"
796
+ },
797
+ {
798
+ "set": "grass_medium_02",
799
+ "asset": "Grass Medium 02",
800
+ "author": "Rob Tuytel (photography), Rico Cilliers (modeling)",
801
+ "license": "CC0",
802
+ "map": "diff",
803
+ "file": "grass_medium_02/grass_medium_02_diff_512.jpg",
804
+ "url": "https://polyhaven.com/a/grass_medium_02",
805
+ "bytes": 26341,
806
+ "dimensions": [512, 512],
807
+ "sha256": "0df2de1764006ceebe633be49dcfaadab6b27b78c7c21f869b1c93f029b92a74"
808
+ },
809
+ {
810
+ "set": "grass_medium_02",
811
+ "asset": "Grass Medium 02",
812
+ "author": "Rob Tuytel (photography), Rico Cilliers (modeling)",
813
+ "license": "CC0",
814
+ "map": "nor_gl",
815
+ "file": "grass_medium_02/grass_medium_02_nor_gl_512.jpg",
816
+ "url": "https://polyhaven.com/a/grass_medium_02",
817
+ "bytes": 16575,
818
+ "dimensions": [512, 512],
819
+ "sha256": "bc6c9eaf576fd396347c5ea5b3931907cb9ace0943f0159c20d4824c4b2fe0d0"
820
+ },
821
+ {
822
+ "set": "kloofendal_48d_partly_cloudy",
823
+ "asset": "Kloofendal 48d Partly Cloudy",
824
+ "author": "Greg Zaal",
825
+ "license": "CC0",
826
+ "map": "hdri",
827
+ "file": "hdri/kloofendal_48d_partly_cloudy_1k.hdr",
828
+ "url": "https://dl.polyhaven.org/file/ph-assets/HDRIs/hdr/1k/kloofendal_48d_partly_cloudy_1k.hdr",
829
+ "bytes": 1637206,
830
+ "dimensions": "1024x512",
831
+ "colourSpace": "linear",
832
+ "sha256": "5477b7dbb2aea4a6947cb36b96339c119f90bf36a03b039af3254b5e6a22896d"
833
+ }
834
+ ],
835
+ "generated": {
836
+ "needle-atlas.png": {
837
+ "what": "A 2x2 RGBA atlas: three spruce branch cards (needles drawn as bundles of side shoots at several angles, lighter tips, dark twig) and one poppy petal, on a hard alpha edge",
838
+ "generator": "examples/strata-terrain-preview/scripts/make-needle-atlas.mjs",
839
+ "seed": 466468,
840
+ "command": "node scripts/make-needle-atlas.mjs",
841
+ "bytes": 321934,
842
+ "dimensions": "1024x1024 (4 cells of 512x512)",
843
+ "preprocessing": "none. Drawn from a seeded PRNG and deflated as PNG by the script itself: no image library, no upload, byte-identical on every run.",
844
+ "sha256": "d2f1fd6eb3f87083a1c72a07add0c485f477b7b5e64e1d9db0108298c75eae50",
845
+ "why": "A photograph of foliage does not give a card with the twig down the middle and needles fanning off both sides, which is what makes an alpha-cutout branch read as a branch from every angle."
846
+ },
847
+ "needle-surface.png": {
848
+ "what": "The same four cells as relief: RG a tangent-space normal cooked from the albedo's own per-needle ridge field, B the ambient occlusion the canopy drops on itself",
849
+ "generator": "examples/strata-terrain-preview/scripts/make-needle-atlas.mjs",
850
+ "seed": 466468,
851
+ "command": "node scripts/make-needle-atlas.mjs",
852
+ "bytes": 1021932,
853
+ "dimensions": "1024x1024 (4 cells of 512x512)",
854
+ "preprocessing": "none. Cooked from the coverage and ridge the same run recorded while drawing the albedo, and deflated as PNG by the script itself: no image library, byte-identical on every run.",
855
+ "sha256": "45d236f6b61f745753fd86b06b0c27d451ae118c9f0164ce44dda51f297ecbf5",
856
+ "why": "An alpha-tested quad has no thickness, so a crown built from cards had exactly one flat normal per card and read as stacked flat quads. A normal per needle plus the spray's own occlusion is what makes a card a mass of needles rather than a silhouette."
857
+ }
858
+ },
859
+ "prepared": {
860
+ "why": "The starter's own art folder is the only place a prepared prop can live: it is what the terrain world's Vite publicDir serves and what ctx.assets loads by path, so the ground maps and the props come from one place with one credits file.",
861
+ "generator": "examples/strata-terrain-preview/scripts/prep-trees.py",
862
+ "command": "~/.local/bin/blender -b --factory-startup --python scripts/prep-trees.py -- --source <scratch>/<download> --out packages/terrain/starter-assets/<set> --species <name> --variant <node> --near <budget> --mid <budget>",
863
+ "license": "CC0 1.0 Universal (public domain dedication), unchanged from the source assets",
864
+ "rawDownloads": "never committed; the upstream .gltf and .bin stay in a scratch directory outside this repository",
865
+ "preprocessing": [
866
+ "split by material, then join to one solid part and one needle part per prop",
867
+ "wood: collapse decimation, then a cylindrical unwrap so the game's own bark map can be sampled on it",
868
+ "wood: loose branch shells dropped whole, biggest first, to reach the budget",
869
+ "needles: whole alpha cards dropped, evenly over the crown's own volume, then the survivors enlarged about their own centres",
870
+ "colours and extra UV sets stripped; cameras, lights and armatures removed",
871
+ "exported with export_apply=True, and every count read back out of the written GLB's JSON chunk"
872
+ ],
873
+ "assets": [
874
+ {
875
+ "asset": "Fir Tree 01",
876
+ "authors": "Rob Tuytel, Rico Cilliers",
877
+ "license": "CC0",
878
+ "url": "https://polyhaven.com/a/fir_tree_01",
879
+ "note": "Poly Haven's own authored LOD2 of tree b (fir_tree_01_b_LOD2, 54,927 triangles, full crown), exported by examples/strata-terrain-preview/scripts/prep-polyhaven-fir.py from the 1k .blend; the forest starter kit's fir."
880
+ },
881
+ {
882
+ "asset": "Rock Moss Set 01",
883
+ "authors": "Rob Tuytel, Rico Cilliers",
884
+ "license": "CC0",
885
+ "url": "https://polyhaven.com/a/rock_moss_set_01",
886
+ "note": "rock01 and rock04, both levels. Shaded by the starter's own mossy_rock set, triplanar."
887
+ },
888
+ {
889
+ "asset": "Boulder 01",
890
+ "authors": "Rob Tuytel",
891
+ "license": "CC0",
892
+ "url": "https://polyhaven.com/a/boulder_01",
893
+ "note": "A second source, so a meadow's stones are not one rock copied."
894
+ },
895
+ {
896
+ "asset": "Boulder 01",
897
+ "authors": "Poly Haven",
898
+ "license": "CC0",
899
+ "url": "https://polyhaven.com/a/boulder_01",
900
+ "note": "Authored LOD1 (33,060 tris) and LOD2 (16,530 tris) with base, normal and roughness maps, exported by examples/strata-terrain-preview/scripts/prep-polyhaven-rock.py; the forest starter kit's boulder."
901
+ }
902
+ ],
903
+ "firedCoverage": {
904
+ "verdict": "superseded 2026-10-05",
905
+ "why": "The card-dropping prep kept 433 of 437,376 needle cards (0.3% of the silhouette). The .blend ships authored LODs whose LOD2 keeps the whole crown; that file replaced fir-b/c near/mid."
906
+ },
907
+ "budgets": {
908
+ "treesNear": 6000,
909
+ "treesMid": 1500,
910
+ "rockNear": 2500,
911
+ "rockMid": 600,
912
+ "measuredTreeNear": 5998,
913
+ "measuredTreeMid": 1497,
914
+ "measuredRockNear": "1924-2235",
915
+ "measuredRockMid": "469-540"
916
+ },
917
+ "files": [
918
+ {
919
+ "bytes": 407309,
920
+ "dimensions": "1024x1024",
921
+ "file": "fir_tree_01/fir_tree_01_twig_arm_1k.jpg",
922
+ "sha256": "d66c81fc073ee7ea97a76b6da2399769f16944e50ef0e007f09c95619f597c79"
923
+ },
924
+ {
925
+ "bytes": 371741,
926
+ "dimensions": "1024x1024",
927
+ "file": "fir_tree_01/fir_tree_01_twig_diff_1k.jpg",
928
+ "sha256": "8c0833a10e4fd44498d848cf9e659fe250a3813984cbd679f42430eb98c61fb8"
929
+ },
930
+ {
931
+ "bytes": 472604,
932
+ "dimensions": "1024x1024",
933
+ "file": "fir_tree_01/fir_tree_01_twig_nor_gl_1k.jpg",
934
+ "sha256": "d470dc39b1d02bbeba06feb0ad818680ef3c24623b4db597270301a5fb8c9369"
935
+ },
936
+ {
937
+ "bytes": 31940,
938
+ "dimensions": null,
939
+ "file": "rocks/boulder-mid.glb",
940
+ "sha256": "92295a63e906931a045be398b4463c9aaaf304b48836c21e3eb9a450807b1548"
941
+ },
942
+ {
943
+ "bytes": 130016,
944
+ "dimensions": null,
945
+ "file": "rocks/boulder-near.glb",
946
+ "sha256": "89d5d00a475de8102ec585a0bd2384855875034f7988f176e16bd0b2a30c7fd7"
947
+ },
948
+ {
949
+ "bytes": 995,
950
+ "dimensions": null,
951
+ "file": "rocks/boulder-prep.json",
952
+ "sha256": "b01e94e9bdae69058bc6bf4c0b84fd6c25d1369b961449243b465855c4228d3e"
953
+ },
954
+ {
955
+ "bytes": 14636,
956
+ "dimensions": null,
957
+ "file": "rocks/rock01-mid.glb",
958
+ "sha256": "4c289382d0c05d2c1bfd36a3c997c8240fe580f76dd0a1d2fe1b3c3af7e3e169"
959
+ },
960
+ {
961
+ "bytes": 48972,
962
+ "dimensions": null,
963
+ "file": "rocks/rock01-near.glb",
964
+ "sha256": "7e78a21d296b4235b4adf3d834f7926b09b928237722691150407647a236eab6"
965
+ },
966
+ {
967
+ "bytes": 1015,
968
+ "dimensions": null,
969
+ "file": "rocks/rock01-prep.json",
970
+ "sha256": "5e7627e1721cf16b347d5128574834340a7088ad66623b7879f9041abda107ae"
971
+ },
972
+ {
973
+ "bytes": 13544,
974
+ "dimensions": null,
975
+ "file": "rocks/rock04-mid.glb",
976
+ "sha256": "4d85f38a080e179e6abddf759b3b023ec5a4becf733259b0067213bb141a35bc"
977
+ },
978
+ {
979
+ "bytes": 46644,
980
+ "dimensions": null,
981
+ "file": "rocks/rock04-near.glb",
982
+ "sha256": "c36532454cb6f6f713d4402227741d823f2f3f98113c6cd9b6bc81c0e0a9de9d"
983
+ },
984
+ {
985
+ "bytes": 1013,
986
+ "dimensions": null,
987
+ "file": "rocks/rock04-prep.json",
988
+ "sha256": "71b79c26df145ef05a3c58fac045964d185b19aa38d7e483d5a87ae488896fc7"
989
+ },
990
+ {
991
+ "bytes": 11324,
992
+ "dimensions": null,
993
+ "file": "rocks/rock13-mid.glb",
994
+ "sha256": "d98074cc7944de0c428502264c2d35b01f6a8b87cd10715132a6a7e0847d8e48"
995
+ },
996
+ {
997
+ "bytes": 5153060,
998
+ "dimensions": null,
999
+ "file": "fir_tree_01/fir-b-lod2.glb",
1000
+ "sha256": "a7e1f126ba7c09aa160f82e200689312334204928c9d822a1eaf13ed9d259dc8"
1001
+ },
1002
+ {
1003
+ "bytes": 2464264,
1004
+ "dimensions": null,
1005
+ "file": "boulder_01/boulder-near.glb",
1006
+ "sha256": "4a86aadf75dd86bf13d32556da6acd2c1d53e2508094fe55a0903f2c44624a59"
1007
+ },
1008
+ {
1009
+ "bytes": 2071256,
1010
+ "dimensions": null,
1011
+ "file": "boulder_01/boulder-mid.glb",
1012
+ "sha256": "4d4a1026047d229d6fbe992d061b4b4e9ef5f837e64239f18e0664a77aed8d84"
1013
+ },
1014
+ {
1015
+ "bytes": 3971572,
1016
+ "dimensions": null,
1017
+ "file": "fir_tree_01/fir-c-lod2.glb",
1018
+ "sha256": "9dba8a8a30f204a2c60f45bd059676cdabbe7287180338c38c1ce54d8530bd7b"
1019
+ }
1020
+ ]
1021
+ }
1022
+ }