incanto 0.13.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/editor/index.html CHANGED
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>Incanto Scene Editor</title>
7
7
  <link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><rect width='16' height='16' rx='3' fill='%236ee7dc'/><text x='8' y='12' text-anchor='middle' font-size='11' font-family='monospace' fill='%230e1018'>i</text></svg>" />
8
- <script type="module" crossorigin src="./assets/index-DSq0gdhE.js"></script>
8
+ <script type="module" crossorigin src="./assets/index-7qOYg7t8.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="./assets/GameServer-C56iOUgF.js">
10
10
  <link rel="stylesheet" crossorigin href="./assets/index-D8QvwvOm.css">
11
11
  </head>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "incanto",
3
- "version": "0.13.0",
3
+ "version": "0.14.0",
4
4
  "description": "Vibe-coding-first web game engine SDK — JSON-driven scenes on three.js",
5
5
  "keywords": [
6
6
  "game-engine",
@@ -2371,8 +2371,7 @@
2371
2371
  "default": 0.5
2372
2372
  },
2373
2373
  "drape": {
2374
- "type": "boolean",
2375
- "default": false
2374
+ "default": null
2376
2375
  },
2377
2376
  "terrain": {
2378
2377
  "type": "string",
@@ -2559,8 +2558,7 @@
2559
2558
  "default": 1
2560
2559
  },
2561
2560
  "drape": {
2562
- "type": "boolean",
2563
- "default": false
2561
+ "default": null
2564
2562
  },
2565
2563
  "terrain": {
2566
2564
  "type": "string",
@@ -5656,8 +5654,7 @@
5656
5654
  "default": true
5657
5655
  },
5658
5656
  "drape": {
5659
- "type": "boolean",
5660
- "default": false
5657
+ "default": null
5661
5658
  },
5662
5659
  "terrain": {
5663
5660
  "type": "string",
@@ -358,14 +358,13 @@ tops radially away with a smooth falloff as a character wades through.
358
358
  | `coverage` | `0.85` | mesh: carpet fill in (0, 1] — below 1 noise carves dirt patches (load-time check) |
359
359
  | `flowers` | `0` | DEPRECATED — confetti heads; use a `Flowers3D` node (load-time check 0–0.2) |
360
360
  | `seed` | `1` | placement seed — identical field across runs/machines |
361
- | `drape` | `false` | **drape each blade onto a Terrain3D's surface** so a field follows rolling ground instead of floating on a flat plane — one big field covers a whole terrain |
362
- | `terrain` | `""` | drape target node path; empty = **auto-find the first Terrain3D** in the tree (the zero-config default when `drape` is on) |
361
+ | `drape` | `null` | **AUTO by default**: whenever the scene has a Terrain3D, every blade roots on the ground under it (samples `heightAt`) — omit this prop and rolling terrain just works. `true` forces it (keeps retrying until a terrain appears — streamed worlds), `false` opts out (flat carpet at the node's Y) |
362
+ | `terrain` | `""` | drape target node path; empty = **auto-find the first Terrain3D** in the tree. A non-empty path that is NOT a Terrain3D fails at load — no silent floating |
363
363
 
364
- > **Rolling terrain?** Set `drape: true` and the field's blades root on the
365
- > ground per-instance (it samples the Terrain3D's `heightAt`). Without draping a
366
- > Foliage3D/Flowers3D is a FLAT carpet at the node's Y, so on hills it
367
- > floats/sinks — either drape it, or place small patches at flat spots (the
368
- > generators still do the latter for backward-compatible output).
364
+ > **Rolling terrain just works.** Since 0.14 draping is on by default: with a
365
+ > Terrain3D in the scene the blades root on the ground per-instance, no wiring.
366
+ > Only set `drape: false` if you WANT a flat carpet at the node's Y (e.g. grass
367
+ > on a flat MeshInstance3D platform above the terrain).
369
368
 
370
369
  ## Flowers3D
371
370
 
@@ -415,8 +414,8 @@ billboard confetti. Deterministic from the `seed` PROP.
415
414
  | `height` | `0.45` | plant height, meters (±25% per-plant jitter) |
416
415
  | `clustering` | `0.6` | 0 uniform … 1 tight Voronoi patches (load-time check) |
417
416
  | `sway` | `0.5` | head-bob wind strength; 0 disables |
418
- | `drape` | `false` | drape each plant onto a Terrain3D's surface (rolling terrain) — see the Foliage3D drape note above |
419
- | `terrain` | `""` | drape target node path; empty = auto-find the first Terrain3D |
417
+ | `drape` | `null` | AUTO by default — plants root on the scene's Terrain3D when one exists; `true` forces, `false` opts out — see the Foliage3D drape note above |
418
+ | `terrain` | `""` | drape target node path; empty = auto-find the first Terrain3D (a wrong path fails at load) |
420
419
 
421
420
  ## Tree3D
422
421
  Procedural trees grown by the ported ez-tree generator (MIT, Dan Greenheck;
@@ -484,8 +483,8 @@ Every instance in a grove also gets a deterministic per-instance color jitter (
484
483
  | `leafFadeStart` | `0` | **leaf LOD** — leaf cards begin collapsing toward their branch at this camera distance (m). `0`/`0` disables (full leaves at any range) |
485
484
  | `leafFadeEnd` | `0` | leaf LOD — cards fully collapsed (zero overdraw) by here; tune ≈ the scene `fog.far` so the thinning hides in fog (load-time check: `> leafFadeStart`) |
486
485
  | `leafShadows` | `true` | `false` keeps trunk/branch shadows but drops the expensive alpha-cutout LEAF shadow pass — big FPS in dense forests |
487
- | `drape` | `false` | **drape a scattered grove onto a Terrain3D**: each instance roots at the ground height under it instead of the node's single Y, so a `count > 1` patch on rolling/carved terrain never floats or buries |
488
- | `terrain` | `""` | drape target node path; empty = auto-find the first Terrain3D (the zero-config default when `drape` is on) |
486
+ | `drape` | `null` | AUTO by default: each scattered instance roots at the ground height under it (instead of the node's single Y) whenever the scene has a Terrain3D — a `count > 1` grove on rolling/carved terrain never floats or buries. `true` forces, `false` opts out |
487
+ | `terrain` | `""` | drape target node path; empty = auto-find the first Terrain3D (a wrong path fails at load) |
489
488
 
490
489
  > **Tree LOD / forest FPS.** Leaf overdraw + the leaf shadow pass dominate a
491
490
  > dense-forest frame (~90% in profiling). For big groves set `leafFadeStart`/
@@ -493,11 +492,11 @@ Every instance in a grove also gets a deterministic per-instance color jitter (
493
492
  > leaf cards (branch silhouette stays), and `leafShadows: false` to drop the leaf
494
493
  > shadow pass. Both default off → existing scenes are unchanged.
495
494
 
496
- > **Floating trees?** A scattered grove (`count > 1`) places every instance at
497
- > the node's single Y, so on rolling or basin-carved terrain the far instances
498
- > float or sink. Set `drape: true` (auto-finds the Terrain3D) so each instance
499
- > roots on the ground under it. The drape is a pure heightAt lookup — no rng
500
- > draw, so the seed/grove layout is byte-identical, only the Y shifts.
495
+ > **Floating trees?** Since 0.14 groves drape automatically whenever the scene
496
+ > has a Terrain3D — each instance roots on the ground under it. The drape is a
497
+ > pure heightAt lookup — no rng draw, so the seed/grove layout is
498
+ > byte-identical, only the Y shifts. `drape: false` restores the flat
499
+ > single-Y placement.
501
500
 
502
501
  ## Terrain3D
503
502
  Procedural heightfield terrain with biome texture splatting (in `incanto/3d`,
@@ -330,7 +330,7 @@ Signals: `movementStateChanged(state)`
330
330
  | `height` | `0.45` | number |
331
331
  | `clustering` | `0.6` | number |
332
332
  | `sway` | `0.5` | number |
333
- | `drape` | `false` | boolean |
333
+ | `drape` | `null` | null |
334
334
  | `terrain` | `""` | string |
335
335
 
336
336
  ## `Foliage3D` — `incanto/3d`
@@ -362,7 +362,7 @@ Signals: `movementStateChanged(state)`
362
362
  | `coverage` | `0.85` | number |
363
363
  | `flowers` | `0` | number |
364
364
  | `seed` | `1` | number |
365
- | `drape` | `false` | boolean |
365
+ | `drape` | `null` | null |
366
366
  | `terrain` | `""` | string |
367
367
 
368
368
  ## `HudLayer` — `incanto`
@@ -836,7 +836,7 @@ Signals: `timeout`
836
836
  | `leafFadeStart` | `0` | number |
837
837
  | `leafFadeEnd` | `0` | number |
838
838
  | `leafShadows` | `true` | boolean |
839
- | `drape` | `false` | boolean |
839
+ | `drape` | `null` | null |
840
840
  | `terrain` | `""` | string |
841
841
 
842
842
  ## `UILayer` — `incanto/2d`
@@ -101,7 +101,6 @@ for (let i = 0; i < 400 && grassPlaced < 14; i++) {
101
101
  position: [round2(x), round2(y), round2(z)],
102
102
  area: [34, 34],
103
103
  density: 10,
104
- terrain: '../../Ground/Surface',
105
104
  },
106
105
  });
107
106
  }
@@ -119,7 +118,6 @@ for (let i = 0; i < 300 && flowersPlaced < 9; i++) {
119
118
  position: [round2(x), round2(y), round2(z)],
120
119
  area: [12, 12],
121
120
  seed: Math.floor(rand() * 1e9),
122
- terrain: '../../Ground/Surface',
123
121
  },
124
122
  });
125
123
  }
@@ -14,7 +14,7 @@
14
14
  "@dimforge/rapier2d-compat": "0.19.3",
15
15
  "@dimforge/rapier3d-compat": "0.19.3",
16
16
  "@pixiv/three-vrm": "^3.5.3",
17
- "incanto": "^0.13.0",
17
+ "incanto": "^0.14.0",
18
18
  "three": "^0.184.0"
19
19
  },
20
20
  "devDependencies": {
@@ -1131,8 +1131,7 @@
1131
1131
  "style": "mesh",
1132
1132
  "position": [83.83, 13.64, 53.8],
1133
1133
  "area": [34, 34],
1134
- "density": 10,
1135
- "terrain": "../../Ground/Surface"
1134
+ "density": 10
1136
1135
  }
1137
1136
  },
1138
1137
  {
@@ -1143,8 +1142,7 @@
1143
1142
  "style": "mesh",
1144
1143
  "position": [48.69, 13.7, 42.89],
1145
1144
  "area": [34, 34],
1146
- "density": 10,
1147
- "terrain": "../../Ground/Surface"
1145
+ "density": 10
1148
1146
  }
1149
1147
  },
1150
1148
  {
@@ -1155,8 +1153,7 @@
1155
1153
  "style": "mesh",
1156
1154
  "position": [-37.46, 18.04, 29.71],
1157
1155
  "area": [34, 34],
1158
- "density": 10,
1159
- "terrain": "../../Ground/Surface"
1156
+ "density": 10
1160
1157
  }
1161
1158
  },
1162
1159
  {
@@ -1167,8 +1164,7 @@
1167
1164
  "style": "mesh",
1168
1165
  "position": [57.21, 16.3, 86.45],
1169
1166
  "area": [34, 34],
1170
- "density": 10,
1171
- "terrain": "../../Ground/Surface"
1167
+ "density": 10
1172
1168
  }
1173
1169
  },
1174
1170
  {
@@ -1179,8 +1175,7 @@
1179
1175
  "style": "mesh",
1180
1176
  "position": [-67.62, 16.83, -54.03],
1181
1177
  "area": [34, 34],
1182
- "density": 10,
1183
- "terrain": "../../Ground/Surface"
1178
+ "density": 10
1184
1179
  }
1185
1180
  },
1186
1181
  {
@@ -1191,8 +1186,7 @@
1191
1186
  "style": "mesh",
1192
1187
  "position": [0.75, 16.94, 89.68],
1193
1188
  "area": [34, 34],
1194
- "density": 10,
1195
- "terrain": "../../Ground/Surface"
1189
+ "density": 10
1196
1190
  }
1197
1191
  },
1198
1192
  {
@@ -1203,8 +1197,7 @@
1203
1197
  "style": "mesh",
1204
1198
  "position": [85.64, 12.48, -28.21],
1205
1199
  "area": [34, 34],
1206
- "density": 10,
1207
- "terrain": "../../Ground/Surface"
1200
+ "density": 10
1208
1201
  }
1209
1202
  },
1210
1203
  {
@@ -1215,8 +1208,7 @@
1215
1208
  "style": "mesh",
1216
1209
  "position": [58.99, 12.3, -5.25],
1217
1210
  "area": [34, 34],
1218
- "density": 10,
1219
- "terrain": "../../Ground/Surface"
1211
+ "density": 10
1220
1212
  }
1221
1213
  },
1222
1214
  {
@@ -1227,8 +1219,7 @@
1227
1219
  "style": "mesh",
1228
1220
  "position": [75.79, 11.98, -31.54],
1229
1221
  "area": [34, 34],
1230
- "density": 10,
1231
- "terrain": "../../Ground/Surface"
1222
+ "density": 10
1232
1223
  }
1233
1224
  },
1234
1225
  {
@@ -1239,8 +1230,7 @@
1239
1230
  "style": "mesh",
1240
1231
  "position": [28.8, 16.05, 70.6],
1241
1232
  "area": [34, 34],
1242
- "density": 10,
1243
- "terrain": "../../Ground/Surface"
1233
+ "density": 10
1244
1234
  }
1245
1235
  },
1246
1236
  {
@@ -1251,8 +1241,7 @@
1251
1241
  "style": "mesh",
1252
1242
  "position": [-74.91, 19.52, -21.04],
1253
1243
  "area": [34, 34],
1254
- "density": 10,
1255
- "terrain": "../../Ground/Surface"
1244
+ "density": 10
1256
1245
  }
1257
1246
  },
1258
1247
  {
@@ -1263,8 +1252,7 @@
1263
1252
  "style": "mesh",
1264
1253
  "position": [5.38, 16.51, 37.28],
1265
1254
  "area": [34, 34],
1266
- "density": 10,
1267
- "terrain": "../../Ground/Surface"
1255
+ "density": 10
1268
1256
  }
1269
1257
  },
1270
1258
  {
@@ -1275,8 +1263,7 @@
1275
1263
  "style": "mesh",
1276
1264
  "position": [-9.71, 15.43, -10.63],
1277
1265
  "area": [34, 34],
1278
- "density": 10,
1279
- "terrain": "../../Ground/Surface"
1266
+ "density": 10
1280
1267
  }
1281
1268
  },
1282
1269
  {
@@ -1287,8 +1274,7 @@
1287
1274
  "style": "mesh",
1288
1275
  "position": [-61.97, 20.04, 41.88],
1289
1276
  "area": [34, 34],
1290
- "density": 10,
1291
- "terrain": "../../Ground/Surface"
1277
+ "density": 10
1292
1278
  }
1293
1279
  },
1294
1280
  {
@@ -1297,8 +1283,7 @@
1297
1283
  "props": {
1298
1284
  "position": [33.23, 14.62, 36.95],
1299
1285
  "area": [12, 12],
1300
- "seed": 357653252,
1301
- "terrain": "../../Ground/Surface"
1286
+ "seed": 357653252
1302
1287
  }
1303
1288
  },
1304
1289
  {
@@ -1307,8 +1292,7 @@
1307
1292
  "props": {
1308
1293
  "position": [-82.3, 19.31, -38.23],
1309
1294
  "area": [12, 12],
1310
- "seed": 398696966,
1311
- "terrain": "../../Ground/Surface"
1295
+ "seed": 398696966
1312
1296
  }
1313
1297
  },
1314
1298
  {
@@ -1317,8 +1301,7 @@
1317
1301
  "props": {
1318
1302
  "position": [-33.36, 18.6, 50.95],
1319
1303
  "area": [12, 12],
1320
- "seed": 400708434,
1321
- "terrain": "../../Ground/Surface"
1304
+ "seed": 400708434
1322
1305
  }
1323
1306
  },
1324
1307
  {
@@ -1327,8 +1310,7 @@
1327
1310
  "props": {
1328
1311
  "position": [-9.78, 17.14, 45.89],
1329
1312
  "area": [12, 12],
1330
- "seed": 575315232,
1331
- "terrain": "../../Ground/Surface"
1313
+ "seed": 575315232
1332
1314
  }
1333
1315
  },
1334
1316
  {
@@ -1337,8 +1319,7 @@
1337
1319
  "props": {
1338
1320
  "position": [55.02, 13.26, 39.6],
1339
1321
  "area": [12, 12],
1340
- "seed": 73428741,
1341
- "terrain": "../../Ground/Surface"
1322
+ "seed": 73428741
1342
1323
  }
1343
1324
  },
1344
1325
  {
@@ -1347,8 +1328,7 @@
1347
1328
  "props": {
1348
1329
  "position": [-49.05, 16.91, -30.14],
1349
1330
  "area": [12, 12],
1350
- "seed": 258165764,
1351
- "terrain": "../../Ground/Surface"
1331
+ "seed": 258165764
1352
1332
  }
1353
1333
  },
1354
1334
  {
@@ -1357,8 +1337,7 @@
1357
1337
  "props": {
1358
1338
  "position": [17.86, 16.44, 76.99],
1359
1339
  "area": [12, 12],
1360
- "seed": 22178236,
1361
- "terrain": "../../Ground/Surface"
1340
+ "seed": 22178236
1362
1341
  }
1363
1342
  },
1364
1343
  {
@@ -1367,8 +1346,7 @@
1367
1346
  "props": {
1368
1347
  "position": [-5.95, 13.7, -35.97],
1369
1348
  "area": [12, 12],
1370
- "seed": 359604670,
1371
- "terrain": "../../Ground/Surface"
1349
+ "seed": 359604670
1372
1350
  }
1373
1351
  },
1374
1352
  {
@@ -1377,8 +1355,7 @@
1377
1355
  "props": {
1378
1356
  "position": [-51.11, 18.29, -4.34],
1379
1357
  "area": [12, 12],
1380
- "seed": 723951523,
1381
- "terrain": "../../Ground/Surface"
1358
+ "seed": 723951523
1382
1359
  }
1383
1360
  },
1384
1361
  {
@@ -13,7 +13,7 @@
13
13
  "@dimforge/rapier2d-compat": "0.19.3",
14
14
  "@dimforge/rapier3d-compat": "0.19.3",
15
15
  "@pixiv/three-vrm": "^3.5.3",
16
- "incanto": "^0.13.0",
16
+ "incanto": "^0.14.0",
17
17
  "three": "^0.184.0"
18
18
  },
19
19
  "devDependencies": {
@@ -13,7 +13,7 @@
13
13
  "@dimforge/rapier2d-compat": "0.19.3",
14
14
  "@dimforge/rapier3d-compat": "0.19.3",
15
15
  "@pixiv/three-vrm": "^3.5.3",
16
- "incanto": "^0.13.0",
16
+ "incanto": "^0.14.0",
17
17
  "three": "^0.184.0"
18
18
  },
19
19
  "devDependencies": {