incanto 0.5.0 → 0.7.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.
Files changed (34) hide show
  1. package/dist/2d.d.ts +14 -3
  2. package/dist/2d.js +3 -3
  3. package/dist/3d.d.ts +36 -3
  4. package/dist/3d.js +3 -3
  5. package/dist/{audio-player-DkBqRTs4.d.ts → audio-player-VSjk_vG8.d.ts} +1 -1
  6. package/dist/{behavior-CWhW3oa6.d.ts → behavior-e3kAmPGC.d.ts} +11 -0
  7. package/dist/{create-game-D8UvwXme.js → create-game-CEFoFN8d.js} +64 -9
  8. package/dist/{create-game-BFESHv1X.js → create-game-X5iRu6pf.js} +28 -8
  9. package/dist/debug.d.ts +3 -1
  10. package/dist/debug.js +56 -6
  11. package/dist/gameplay.d.ts +1 -1
  12. package/dist/index.d.ts +21 -4
  13. package/dist/index.js +3 -3
  14. package/dist/{loader-D2u0fVW2.d.ts → loader-y_X4zYO0.d.ts} +1 -1
  15. package/dist/net.d.ts +1 -1
  16. package/dist/{particle-sim-CFkILGwh.js → particle-sim-CrTE7c02.js} +36 -2
  17. package/dist/{physics-2d-KXn1N1jF.js → physics-2d-DmQ540uR.js} +1 -1
  18. package/dist/{physics-3d-C58oQzTX.js → physics-3d-CDjuhtt_.js} +1 -1
  19. package/dist/react.d.ts +1 -1
  20. package/dist/react.js +1 -1
  21. package/dist/{register-D71C4rDC.js → register-ClKnoILk.js} +37 -5
  22. package/dist/{register-DvPHJdVj.js → register-CscQqB7V.js} +54 -3
  23. package/dist/test.d.ts +2 -2
  24. package/dist/test.js +7 -7
  25. package/editor/assets/{agent8-DruKhR22.js → agent8-1WJU-yXr.js} +1 -1
  26. package/editor/assets/{index-D2qufqUo.js → index-DzYFgZbl.js} +81 -81
  27. package/editor/index.html +1 -1
  28. package/package.json +1 -1
  29. package/schemas/scene.schema.json +315 -0
  30. package/skills/incanto-behaviors-and-scripts.md +25 -0
  31. package/skills/incanto-building-2d-games.md +6 -0
  32. package/skills/incanto-building-3d-games.md +13 -0
  33. package/skills/incanto-node-reference.md +70 -0
  34. package/skills/incanto-scene-json-authoring.md +19 -0
@@ -167,3 +167,28 @@ import { Sprite2D } from 'incanto/2d'; // node classes live in their dimension e
167
167
  const coin = new Sprite2D('Coin');
168
168
  coin.uid = newUid(); // n_xxxxxxxxxxxxxxxx (crypto, 16 base36 chars)
169
169
  ```
170
+
171
+ ## Time & frame-rate independence (Unity Time equivalents)
172
+
173
+ Movement is frame-rate independent when you multiply by `dt` — the seconds
174
+ (already `timeScale`-adjusted) your update callbacks receive:
175
+
176
+ ```ts
177
+ override update(dt: number): void {
178
+ // 1 meter per second at ANY fps — 30, 60, or 144:
179
+ node.position[0] += 1 * dt;
180
+ }
181
+ ```
182
+
183
+ | Unity | Incanto |
184
+ |---|---|
185
+ | `Time.deltaTime` | the `dt` argument of `update(dt)` / `fixedUpdate(dt)` |
186
+ | `Time.time` | `engine.time` (elapsed game seconds, scaled; resets per scene) |
187
+ | `Time.unscaledTime` | `engine.unscaledTime` (real seconds — UI during slow-mo) |
188
+ | `Time.timeScale` | `engine.timeScale` (1 realtime · 0.5 slow-mo · 0 frozen) |
189
+ | `Time.fixedDeltaTime` | the `dt` of `fixedUpdate` (1/60 by default) |
190
+
191
+ `engine.timeScale` scales variable AND fixed updates together — physics,
192
+ timers, animations and behaviors all slow down as one. Bullet-time:
193
+ `engine.timeScale = 0.3`; freeze frames: `hitStop(engine, 0.08)` from
194
+ `incanto/gameplay`.
@@ -240,3 +240,9 @@ solid core carries the colour). `rate: 0` +
240
240
 
241
241
  `node.replay()` re-arms a one-shot. Simulation is deterministic under the
242
242
  engine seed — runScript verifies particle gameplay reproducibly.
243
+
244
+ ## `static: true` for big scenes
245
+
246
+ Mark unchanging subtrees (tile decor, backgrounds) `static: true` — the
247
+ renderer syncs them once and skips them every frame. Flip to `false` to
248
+ resume live syncing.
@@ -366,3 +366,16 @@ from a `seed`, with `heightAt(x, z)` for spawning/placement and a
366
366
  `{shape: 'heightfield'}` collider recipe (Terrain3D as the CHILD of a
367
367
  `StaticBody3D`). Full themes table, custom layer format and the water/beach
368
368
  pairing live in the **incanto-environment** skill.
369
+
370
+ ## Performance levers for big scenes
371
+
372
+ - **`static: true`** (any Node3D): the renderer syncs that subtree ONCE and
373
+ skips it every frame after — mark terrain, buildings, rocks, fences,
374
+ whole decor groups. Do NOT mark animated nodes (Water3D, Particles3D,
375
+ animated models, cameras): they freeze (the engine warns once). Set
376
+ `static = false` at runtime to resume live syncing after an edit.
377
+ - **`environment.shadows.static: true`**: the shadow pass renders once per
378
+ scene/environment change instead of every frame (measured ~42% of a
379
+ dense-forest frame). Use when shadow CASTERS don't move — pair moving
380
+ characters with sprite/blob shadows. After a one-off world edit call
381
+ `renderer.refreshShadows()`.
@@ -21,8 +21,10 @@ description: GENERATED complete reference of every Incanto node type — props,
21
21
  |---|---|---|
22
22
  | `position` | `[0,0]` | array |
23
23
  | `rotation` | `0` | number |
24
+ | `static` | `false` | boolean |
24
25
  | `scale` | `[1,1]` | array |
25
26
  | `renderOrder` | `0` | number |
27
+ | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
26
28
  | `visible` | `true` | boolean |
27
29
  | `texture` | `""` | string |
28
30
  | `anchor` | `[0.5,0.5]` | array |
@@ -42,9 +44,11 @@ Signals: `animationFinished(name)`
42
44
  |---|---|---|
43
45
  | `position` | `[0,0,0]` | array |
44
46
  | `rotation` | `[0,0,0]` | array |
47
+ | `static` | `false` | boolean |
45
48
  | `scale` | `[1,1,1]` | array |
46
49
  | `visible` | `true` | boolean |
47
50
  | `renderOrder` | `0` | number |
51
+ | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
48
52
  | `texture` | `""` | string |
49
53
  | `size` | `[1,1]` | array |
50
54
  | `billboard` | `"y"` | one of: `y` `full` `none` |
@@ -70,8 +74,10 @@ Signals: `animationFinished(name)`
70
74
  |---|---|---|
71
75
  | `position` | `[0,0]` | array |
72
76
  | `rotation` | `0` | number |
77
+ | `static` | `false` | boolean |
73
78
  | `scale` | `[1,1]` | array |
74
79
  | `renderOrder` | `0` | number |
80
+ | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
75
81
  | `visible` | `true` | boolean |
76
82
  | `collider` | `{}` | object |
77
83
 
@@ -83,9 +89,11 @@ Signals: `triggerEnter(other)` · `triggerExit(other)`
83
89
  |---|---|---|
84
90
  | `position` | `[0,0,0]` | array |
85
91
  | `rotation` | `[0,0,0]` | array |
92
+ | `static` | `false` | boolean |
86
93
  | `scale` | `[1,1,1]` | array |
87
94
  | `visible` | `true` | boolean |
88
95
  | `renderOrder` | `0` | number |
96
+ | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
89
97
  | `collider` | `{}` | object |
90
98
 
91
99
  Signals: `triggerEnter(other)` · `triggerExit(other)`
@@ -115,9 +123,11 @@ Signals: `finished`
115
123
  |---|---|---|
116
124
  | `position` | `[0,0,0]` | array |
117
125
  | `rotation` | `[0,0,0]` | array |
126
+ | `static` | `false` | boolean |
118
127
  | `scale` | `[1,1,1]` | array |
119
128
  | `visible` | `true` | boolean |
120
129
  | `renderOrder` | `0` | number |
130
+ | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
121
131
  | `mode` | `"screen"` | one of: `screen` `y` `none` |
122
132
 
123
133
  ## `Camera2D` — `incanto/2d`
@@ -126,8 +136,10 @@ Signals: `finished`
126
136
  |---|---|---|
127
137
  | `position` | `[0,0]` | array |
128
138
  | `rotation` | `0` | number |
139
+ | `static` | `false` | boolean |
129
140
  | `scale` | `[1,1]` | array |
130
141
  | `renderOrder` | `0` | number |
142
+ | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
131
143
  | `visible` | `true` | boolean |
132
144
  | `follow` | `""` | string |
133
145
  | `smoothing` | `0` | number |
@@ -141,9 +153,11 @@ Signals: `finished`
141
153
  |---|---|---|
142
154
  | `position` | `[0,0,0]` | array |
143
155
  | `rotation` | `[0,0,0]` | array |
156
+ | `static` | `false` | boolean |
144
157
  | `scale` | `[1,1,1]` | array |
145
158
  | `visible` | `true` | boolean |
146
159
  | `renderOrder` | `0` | number |
160
+ | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
147
161
  | `fov` | `60` | number |
148
162
  | `near` | `0.1` | number |
149
163
  | `far` | `1000` | number |
@@ -155,8 +169,10 @@ Signals: `finished`
155
169
  |---|---|---|
156
170
  | `position` | `[0,0]` | array |
157
171
  | `rotation` | `0` | number |
172
+ | `static` | `false` | boolean |
158
173
  | `scale` | `[1,1]` | array |
159
174
  | `renderOrder` | `0` | number |
175
+ | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
160
176
  | `visible` | `true` | boolean |
161
177
  | `collider` | `{}` | object |
162
178
  | `velocity` | `[0,0]` | array |
@@ -171,9 +187,11 @@ Signals: `triggerEnter(other)` · `triggerExit(other)`
171
187
  |---|---|---|
172
188
  | `position` | `[0,0,0]` | array |
173
189
  | `rotation` | `[0,0,0]` | array |
190
+ | `static` | `false` | boolean |
174
191
  | `scale` | `[1,1,1]` | array |
175
192
  | `visible` | `true` | boolean |
176
193
  | `renderOrder` | `0` | number |
194
+ | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
177
195
  | `collider` | `{}` | object |
178
196
  | `velocity` | `[0,0,0]` | array |
179
197
  | `snapToGround` | `true` | boolean |
@@ -197,9 +215,11 @@ Signals: `triggerEnter(other)` · `triggerExit(other)`
197
215
  |---|---|---|
198
216
  | `position` | `[0,0,0]` | array |
199
217
  | `rotation` | `[0,0,0]` | array |
218
+ | `static` | `false` | boolean |
200
219
  | `scale` | `[1,1,1]` | array |
201
220
  | `visible` | `true` | boolean |
202
221
  | `renderOrder` | `0` | number |
222
+ | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
203
223
  | `view` | `"free"` | one of: `free` `firstPerson` `quarter` `side` |
204
224
  | `camDistance` | `4` | number |
205
225
  | `eyeHeight` | `0.64` | number |
@@ -230,8 +250,10 @@ Signals: `movementStateChanged(state)`
230
250
  |---|---|---|
231
251
  | `position` | `[0,0]` | array |
232
252
  | `rotation` | `0` | number |
253
+ | `static` | `false` | boolean |
233
254
  | `scale` | `[1,1]` | array |
234
255
  | `renderOrder` | `0` | number |
256
+ | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
235
257
  | `visible` | `true` | boolean |
236
258
  | `size` | `[100,100]` | array |
237
259
  | `color` | `"#ffffff"` | string |
@@ -244,9 +266,11 @@ Signals: `movementStateChanged(state)`
244
266
  |---|---|---|
245
267
  | `position` | `[0,0,0]` | array |
246
268
  | `rotation` | `[0,0,0]` | array |
269
+ | `static` | `false` | boolean |
247
270
  | `scale` | `[1,1,1]` | array |
248
271
  | `visible` | `true` | boolean |
249
272
  | `renderOrder` | `0` | number |
273
+ | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
250
274
  | `color` | `"#ffffff"` | string |
251
275
  | `intensity` | `1` | number |
252
276
  | `castShadow` | `false` | boolean |
@@ -260,9 +284,11 @@ Signals: `movementStateChanged(state)`
260
284
  |---|---|---|
261
285
  | `position` | `[0,0,0]` | array |
262
286
  | `rotation` | `[0,0,0]` | array |
287
+ | `static` | `false` | boolean |
263
288
  | `scale` | `[1,1,1]` | array |
264
289
  | `visible` | `true` | boolean |
265
290
  | `renderOrder` | `0` | number |
291
+ | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
266
292
  | `density` | `"sparse"` | one of: `lush` `sparse` `none` |
267
293
  | `area` | `[20,20]` | array |
268
294
  | `seed` | `1` | number |
@@ -280,9 +306,11 @@ Signals: `movementStateChanged(state)`
280
306
  |---|---|---|
281
307
  | `position` | `[0,0,0]` | array |
282
308
  | `rotation` | `[0,0,0]` | array |
309
+ | `static` | `false` | boolean |
283
310
  | `scale` | `[1,1,1]` | array |
284
311
  | `visible` | `true` | boolean |
285
312
  | `renderOrder` | `2` | number |
313
+ | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
286
314
  | `kind` | `"grass"` | one of: `grass` `flowers` `reeds` |
287
315
  | `style` | `"mesh"` | one of: `blades` `simple` `mesh` `tufts` |
288
316
  | `tuftStyle` | `"grass"` | one of: `grass` `fern` |
@@ -317,8 +345,10 @@ Signals: `movementStateChanged(state)`
317
345
  |---|---|---|
318
346
  | `position` | `[0,0]` | array |
319
347
  | `rotation` | `0` | number |
348
+ | `static` | `false` | boolean |
320
349
  | `scale` | `[1,1]` | array |
321
350
  | `renderOrder` | `0` | number |
351
+ | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
322
352
  | `visible` | `true` | boolean |
323
353
  | `type` | `"revolute"` | one of: `fixed` `revolute` `rope` `spring` |
324
354
  | `target` | `""` | string |
@@ -334,9 +364,11 @@ Signals: `movementStateChanged(state)`
334
364
  |---|---|---|
335
365
  | `position` | `[0,0,0]` | array |
336
366
  | `rotation` | `[0,0,0]` | array |
367
+ | `static` | `false` | boolean |
337
368
  | `scale` | `[1,1,1]` | array |
338
369
  | `visible` | `true` | boolean |
339
370
  | `renderOrder` | `0` | number |
371
+ | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
340
372
  | `type` | `"spherical"` | one of: `fixed` `spherical` `rope` `spring` |
341
373
  | `target` | `""` | string |
342
374
  | `anchor` | `[0,0,0]` | array |
@@ -351,8 +383,10 @@ Signals: `movementStateChanged(state)`
351
383
  |---|---|---|
352
384
  | `position` | `[0,0]` | array |
353
385
  | `rotation` | `0` | number |
386
+ | `static` | `false` | boolean |
354
387
  | `scale` | `[1,1]` | array |
355
388
  | `renderOrder` | `0` | number |
389
+ | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
356
390
  | `visible` | `true` | boolean |
357
391
  | `text` | `""` | string |
358
392
  | `fontSize` | `16` | number |
@@ -366,9 +400,11 @@ Signals: `movementStateChanged(state)`
366
400
  |---|---|---|
367
401
  | `position` | `[0,0,0]` | array |
368
402
  | `rotation` | `[0,0,0]` | array |
403
+ | `static` | `false` | boolean |
369
404
  | `scale` | `[1,1,1]` | array |
370
405
  | `visible` | `true` | boolean |
371
406
  | `renderOrder` | `0` | number |
407
+ | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
372
408
  | `sections` | `[]` | array |
373
409
  | `slices` | `24` | number |
374
410
  | `smooth` | `4` | number |
@@ -382,9 +418,11 @@ Signals: `movementStateChanged(state)`
382
418
  |---|---|---|
383
419
  | `position` | `[0,0,0]` | array |
384
420
  | `rotation` | `[0,0,0]` | array |
421
+ | `static` | `false` | boolean |
385
422
  | `scale` | `[1,1,1]` | array |
386
423
  | `visible` | `true` | boolean |
387
424
  | `renderOrder` | `0` | number |
425
+ | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
388
426
  | `mesh` | `"box"` | one of: `box` `sphere` `capsule` `plane` `cylinder` `gem` |
389
427
  | `size` | `[1,1,1]` | array |
390
428
  | `material` | `{}` | object |
@@ -397,9 +435,11 @@ Signals: `movementStateChanged(state)`
397
435
  |---|---|---|
398
436
  | `position` | `[0,0,0]` | array |
399
437
  | `rotation` | `[0,0,0]` | array |
438
+ | `static` | `false` | boolean |
400
439
  | `scale` | `[1,1,1]` | array |
401
440
  | `visible` | `true` | boolean |
402
441
  | `renderOrder` | `0` | number |
442
+ | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
403
443
  | `model` | `""` | string |
404
444
  | `animation` | `""` | string |
405
445
  | `targetHeight` | `0` | number |
@@ -432,8 +472,10 @@ _No props (structural fields only)._
432
472
  |---|---|---|
433
473
  | `position` | `[0,0]` | array |
434
474
  | `rotation` | `0` | number |
475
+ | `static` | `false` | boolean |
435
476
  | `scale` | `[1,1]` | array |
436
477
  | `renderOrder` | `0` | number |
478
+ | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
437
479
  | `visible` | `true` | boolean |
438
480
 
439
481
  ## `Node3D` — `incanto/3d`
@@ -442,9 +484,11 @@ _No props (structural fields only)._
442
484
  |---|---|---|
443
485
  | `position` | `[0,0,0]` | array |
444
486
  | `rotation` | `[0,0,0]` | array |
487
+ | `static` | `false` | boolean |
445
488
  | `scale` | `[1,1,1]` | array |
446
489
  | `visible` | `true` | boolean |
447
490
  | `renderOrder` | `0` | number |
491
+ | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
448
492
 
449
493
  ## `OmniLight3D` — `incanto/3d`
450
494
 
@@ -452,9 +496,11 @@ _No props (structural fields only)._
452
496
  |---|---|---|
453
497
  | `position` | `[0,0,0]` | array |
454
498
  | `rotation` | `[0,0,0]` | array |
499
+ | `static` | `false` | boolean |
455
500
  | `scale` | `[1,1,1]` | array |
456
501
  | `visible` | `true` | boolean |
457
502
  | `renderOrder` | `0` | number |
503
+ | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
458
504
  | `color` | `"#ffffff"` | string |
459
505
  | `intensity` | `1` | number |
460
506
  | `range` | `0` | number |
@@ -465,8 +511,10 @@ _No props (structural fields only)._
465
511
  |---|---|---|
466
512
  | `position` | `[0,0]` | array |
467
513
  | `rotation` | `0` | number |
514
+ | `static` | `false` | boolean |
468
515
  | `scale` | `[1,1]` | array |
469
516
  | `renderOrder` | `0` | number |
517
+ | `orderGroup` | `"effects"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
470
518
  | `visible` | `true` | boolean |
471
519
  | `preset` | `"custom"` | one of: `custom` `fire` `smoke` `sparks` `fireworks` `explosion` `flash` `lightning` `rain` `snow` `magic` |
472
520
  | `emitting` | `true` | boolean |
@@ -497,9 +545,11 @@ Signals: `finished`
497
545
  |---|---|---|
498
546
  | `position` | `[0,0,0]` | array |
499
547
  | `rotation` | `[0,0,0]` | array |
548
+ | `static` | `false` | boolean |
500
549
  | `scale` | `[1,1,1]` | array |
501
550
  | `visible` | `true` | boolean |
502
551
  | `renderOrder` | `0` | number |
552
+ | `orderGroup` | `"effects"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
503
553
  | `preset` | `"custom"` | one of: `custom` `fire` `smoke` `sparks` `fireworks` `explosion` `flash` `lightning` `rain` `snow` `magic` |
504
554
  | `emitting` | `true` | boolean |
505
555
  | `rate` | `40` | number |
@@ -530,8 +580,10 @@ Signals: `finished`
530
580
  |---|---|---|
531
581
  | `position` | `[0,0]` | array |
532
582
  | `rotation` | `0` | number |
583
+ | `static` | `false` | boolean |
533
584
  | `scale` | `[1,1]` | array |
534
585
  | `renderOrder` | `0` | number |
586
+ | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
535
587
  | `visible` | `true` | boolean |
536
588
  | `collider` | `{}` | object |
537
589
  | `mass` | `1` | number |
@@ -549,9 +601,11 @@ Signals: `triggerEnter(other)` · `triggerExit(other)`
549
601
  |---|---|---|
550
602
  | `position` | `[0,0,0]` | array |
551
603
  | `rotation` | `[0,0,0]` | array |
604
+ | `static` | `false` | boolean |
552
605
  | `scale` | `[1,1,1]` | array |
553
606
  | `visible` | `true` | boolean |
554
607
  | `renderOrder` | `0` | number |
608
+ | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
555
609
  | `collider` | `{}` | object |
556
610
  | `mass` | `1` | number |
557
611
  | `gravityScale` | `1` | number |
@@ -568,8 +622,10 @@ Signals: `triggerEnter(other)` · `triggerExit(other)`
568
622
  |---|---|---|
569
623
  | `position` | `[0,0]` | array |
570
624
  | `rotation` | `0` | number |
625
+ | `static` | `false` | boolean |
571
626
  | `scale` | `[1,1]` | array |
572
627
  | `renderOrder` | `0` | number |
628
+ | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
573
629
  | `visible` | `true` | boolean |
574
630
  | `texture` | `""` | string |
575
631
  | `anchor` | `[0.5,0.5]` | array |
@@ -584,9 +640,11 @@ Signals: `triggerEnter(other)` · `triggerExit(other)`
584
640
  |---|---|---|
585
641
  | `position` | `[0,0,0]` | array |
586
642
  | `rotation` | `[0,0,0]` | array |
643
+ | `static` | `false` | boolean |
587
644
  | `scale` | `[1,1,1]` | array |
588
645
  | `visible` | `true` | boolean |
589
646
  | `renderOrder` | `0` | number |
647
+ | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
590
648
  | `texture` | `""` | string |
591
649
  | `size` | `[1,1]` | array |
592
650
  | `billboard` | `"y"` | one of: `y` `full` `none` |
@@ -605,8 +663,10 @@ Signals: `triggerEnter(other)` · `triggerExit(other)`
605
663
  |---|---|---|
606
664
  | `position` | `[0,0]` | array |
607
665
  | `rotation` | `0` | number |
666
+ | `static` | `false` | boolean |
608
667
  | `scale` | `[1,1]` | array |
609
668
  | `renderOrder` | `0` | number |
669
+ | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
610
670
  | `visible` | `true` | boolean |
611
671
  | `collider` | `{}` | object |
612
672
 
@@ -618,9 +678,11 @@ Signals: `triggerEnter(other)` · `triggerExit(other)`
618
678
  |---|---|---|
619
679
  | `position` | `[0,0,0]` | array |
620
680
  | `rotation` | `[0,0,0]` | array |
681
+ | `static` | `false` | boolean |
621
682
  | `scale` | `[1,1,1]` | array |
622
683
  | `visible` | `true` | boolean |
623
684
  | `renderOrder` | `0` | number |
685
+ | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
624
686
  | `collider` | `{}` | object |
625
687
 
626
688
  Signals: `triggerEnter(other)` · `triggerExit(other)`
@@ -631,9 +693,11 @@ Signals: `triggerEnter(other)` · `triggerExit(other)`
631
693
  |---|---|---|
632
694
  | `position` | `[0,0,0]` | array |
633
695
  | `rotation` | `[0,0,0]` | array |
696
+ | `static` | `false` | boolean |
634
697
  | `scale` | `[1,1,1]` | array |
635
698
  | `visible` | `true` | boolean |
636
699
  | `renderOrder` | `0` | number |
700
+ | `orderGroup` | `"terrain"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
637
701
  | `size` | `[200,200]` | array |
638
702
  | `maxHeight` | `28` | number |
639
703
  | `seed` | `1` | number |
@@ -663,9 +727,11 @@ Signals: `timeout`
663
727
  |---|---|---|
664
728
  | `position` | `[0,0,0]` | array |
665
729
  | `rotation` | `[0,0,0]` | array |
730
+ | `static` | `false` | boolean |
666
731
  | `scale` | `[1,1,1]` | array |
667
732
  | `visible` | `true` | boolean |
668
733
  | `renderOrder` | `0` | number |
734
+ | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
669
735
  | `tier` | `"medium"` | one of: `simple` `medium` `high` |
670
736
  | `type` | `"conifer"` | one of: `conifer` `broadleaf` `dead` `bush` |
671
737
  | `seed` | `1` | number |
@@ -731,9 +797,11 @@ Signals: `bannerShown`
731
797
  |---|---|---|
732
798
  | `position` | `[0,0,0]` | array |
733
799
  | `rotation` | `[0,0,0]` | array |
800
+ | `static` | `false` | boolean |
734
801
  | `scale` | `[1,1,1]` | array |
735
802
  | `visible` | `true` | boolean |
736
803
  | `renderOrder` | `0` | number |
804
+ | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
737
805
  | `voxels` | `[]` | array |
738
806
 
739
807
  Signals: `blocksChanged`
@@ -744,9 +812,11 @@ Signals: `blocksChanged`
744
812
  |---|---|---|
745
813
  | `position` | `[0,0,0]` | array |
746
814
  | `rotation` | `[0,0,0]` | array |
815
+ | `static` | `false` | boolean |
747
816
  | `scale` | `[1,1,1]` | array |
748
817
  | `visible` | `true` | boolean |
749
818
  | `renderOrder` | `1` | number |
819
+ | `orderGroup` | `"default"` | one of: `background` `terrain` `default` `characters` `effects` `overlay` |
750
820
  | `size` | `[40,40]` | array |
751
821
  | `color` | `"#2a6fbe"` | string |
752
822
  | `opacity` | `0.8` | number |
@@ -106,6 +106,25 @@ physically adjacent, and makes subtree copy/move one-object operations. Flat
106
106
  addressing needs are covered by uid (`getNodeByUid`). Full reasoning:
107
107
  docs/adr/0001 in the repo.
108
108
 
109
+ ## Draw order: orderGroup + renderOrder
110
+
111
+ Every visual node has TWO ordering props: `orderGroup` (a named band —
112
+ `background < terrain < default < characters < effects < overlay`) and
113
+ `renderOrder` (fine offset INSIDE the band). Effective order =
114
+ band base + renderOrder. Type defaults: particles ship in `effects`,
115
+ Terrain3D in `terrain`, everything else `default`.
116
+
117
+ ```json
118
+ { "name": "Hero", "type": "Sprite2D",
119
+ "props": { "orderGroup": "characters" } },
120
+ { "name": "Smoke", "type": "Particles2D",
121
+ "props": { "renderOrder": 5 } } // effects band, +5 within it
122
+ ```
123
+
124
+ In 3D the bands order the TRANSPARENT pass (opaque geometry is depth-
125
+ tested regardless); in 2D they are the layering system. 2D `zIndex` is an
126
+ accepted alias for `renderOrder`.
127
+
109
128
  ## Parents and children
110
129
 
111
130
  EVERY node type can hold children — `children` is universal, so any node works