@3driseai/3drise-core 1.0.22 → 1.0.24

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 (74) hide show
  1. package/dist/catalog/catalogInfo.d.ts.map +1 -1
  2. package/dist/catalog/catalogInfo.js +5 -4
  3. package/dist/catalog/objectCatalog.d.ts.map +1 -1
  4. package/dist/catalog/objectCatalog.js +2 -7
  5. package/dist/data/defaults.d.ts +0 -12
  6. package/dist/data/defaults.d.ts.map +1 -1
  7. package/dist/data/defaults.js +0 -12
  8. package/dist/data/particlesDefaults.d.ts.map +1 -1
  9. package/dist/data/particlesDefaults.js +27 -0
  10. package/dist/data/textDefaults.d.ts +1 -1
  11. package/dist/data/textDefaults.d.ts.map +1 -1
  12. package/dist/data/textDefaults.js +34 -14
  13. package/dist/environment/terrainConfigs.d.ts +4 -1
  14. package/dist/environment/terrainConfigs.d.ts.map +1 -1
  15. package/dist/environment/terrainConfigs.js +28 -28
  16. package/dist/properties/registry.d.ts +10 -5
  17. package/dist/properties/registry.d.ts.map +1 -1
  18. package/dist/properties/registry.js +53 -17
  19. package/dist/properties/tables/geometryProperties.d.ts +7 -0
  20. package/dist/properties/tables/geometryProperties.d.ts.map +1 -1
  21. package/dist/properties/tables/geometryProperties.js +9 -1
  22. package/dist/properties/tables/optionalProperties.d.ts +12 -0
  23. package/dist/properties/tables/optionalProperties.d.ts.map +1 -1
  24. package/dist/properties/tables/optionalProperties.js +5 -0
  25. package/dist/properties/tables/particlesProperties.d.ts.map +1 -1
  26. package/dist/properties/tables/particlesProperties.js +38 -0
  27. package/dist/properties/tables/textProperties.d.ts.map +1 -1
  28. package/dist/properties/tables/textProperties.js +38 -12
  29. package/dist/properties/types.d.ts +1 -1
  30. package/dist/properties/types.d.ts.map +1 -1
  31. package/dist/services/SceneActions.d.ts +21 -0
  32. package/dist/services/SceneActions.d.ts.map +1 -1
  33. package/dist/services/SceneActions.js +65 -0
  34. package/dist/three/LetterV.d.ts +7 -1
  35. package/dist/three/LetterV.d.ts.map +1 -1
  36. package/dist/three/Text2DV.d.ts +7 -1
  37. package/dist/three/Text2DV.d.ts.map +1 -1
  38. package/dist/three/Text3DV.d.ts +7 -1
  39. package/dist/three/Text3DV.d.ts.map +1 -1
  40. package/dist/types/actions.d.ts +0 -1
  41. package/dist/types/actions.d.ts.map +1 -1
  42. package/dist/types/commands.d.ts +13 -0
  43. package/dist/types/commands.d.ts.map +1 -1
  44. package/dist/types/generativeParticles.d.ts +52 -2
  45. package/dist/types/generativeParticles.d.ts.map +1 -1
  46. package/dist/types/index.d.ts +0 -1
  47. package/dist/types/index.d.ts.map +1 -1
  48. package/dist/types/objectSettings.d.ts +2 -0
  49. package/dist/types/objectSettings.d.ts.map +1 -1
  50. package/dist/types/scene3d.d.ts +30 -0
  51. package/dist/types/scene3d.d.ts.map +1 -1
  52. package/dist/types/textObjects.d.ts +22 -3
  53. package/dist/types/textObjects.d.ts.map +1 -1
  54. package/dist/types/textObjects.js +3 -3
  55. package/dist/utils/cameraControls.d.ts +17 -0
  56. package/dist/utils/cameraControls.d.ts.map +1 -0
  57. package/dist/utils/cameraControls.js +20 -0
  58. package/dist/utils/dataUtils.d.ts.map +1 -1
  59. package/dist/utils/dataUtils.js +0 -6
  60. package/dist/utils/index.d.ts +3 -0
  61. package/dist/utils/index.d.ts.map +1 -1
  62. package/dist/utils/index.js +3 -0
  63. package/dist/utils/materialVariant.d.ts +10 -0
  64. package/dist/utils/materialVariant.d.ts.map +1 -0
  65. package/dist/utils/materialVariant.js +50 -0
  66. package/dist/utils/objectEffects.d.ts +2 -2
  67. package/dist/utils/objectEffects.d.ts.map +1 -1
  68. package/dist/utils/objectEffects.js +3 -4
  69. package/dist/utils/objectMigration.d.ts.map +1 -1
  70. package/dist/utils/objectMigration.js +2 -1
  71. package/dist/utils/textMigration.d.ts +3 -0
  72. package/dist/utils/textMigration.d.ts.map +1 -0
  73. package/dist/utils/textMigration.js +56 -0
  74. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"catalogInfo.d.ts","sourceRoot":"","sources":["../../src/catalog/catalogInfo.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,eAAe;IAC5B,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAC/H;AACD,MAAM,WAAW,kBAAkB;IAC/B,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IAClF,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7G;AAED,eAAO,MAAM,aAAa,EAAE,eAAe,EAc1C,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,EAAE,CA6KjE,CAAC"}
1
+ {"version":3,"file":"catalogInfo.d.ts","sourceRoot":"","sources":["../../src/catalog/catalogInfo.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,eAAe;IAC5B,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAC/H;AACD,MAAM,WAAW,kBAAkB;IAC/B,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IAClF,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7G;AAED,eAAO,MAAM,aAAa,EAAE,eAAe,EAc1C,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,EAAE,CA8KjE,CAAC"}
@@ -5,7 +5,7 @@
5
5
  // Per type and per variant: the words the Add menu and the AI choose by (description,
6
6
  // tags), the display name, and the transform / material a variant starts with.
7
7
  // Configs live in the registry's DEFAULT_* tables (effects, particles, grids, lights,
8
- // environment, space); only mesh, gallery and text variants carry their config here,
8
+ // environment, space); only mesh and gallery variants carry their config here,
9
9
  // because those families have no defaults table.
10
10
  //
11
11
  // `key` is permanent (it is what scenes store in config.type / shapeType / layout).
@@ -25,7 +25,7 @@ export const CATALOG_TYPES = [
25
25
  { key: "particles", legacyId: "f7b5bfba-6a68-11f1-8573-00163e32d101", description: "A particle system arranged in a configurable shape. Use for swarms, sparks, dust, dotted shapes.", icon: "sparkles", order: 8, enabled: true },
26
26
  { key: "path", legacyId: "f7d663ca-6a68-11f1-8573-00163e32d101", description: "A 3D spline or path that other objects can follow.", icon: "draw-polygon", order: 9, enabled: false },
27
27
  { key: "space", legacyId: "f7f6f91b-6a68-11f1-8573-00163e32d101", description: "Elements from space", icon: "planet-ringed", order: 10, enabled: true },
28
- { key: "text", legacyId: "e841a567-7fb1-49ac-9d90-eb26a414b07f", description: "2d text, 3d text and more", icon: "font", order: 11, enabled: true },
28
+ { key: "text", legacyId: "e841a567-7fb1-49ac-9d90-eb26a414b07f", description: "Flat text: plain labels and animated looks (handwriting, neon, ink, metal…)", icon: "font", order: 11, enabled: true },
29
29
  { key: "land", description: "Placeable patches of terrain - mountains, hills, dunes, canyon - sized and moved like any object, as many as you like. For the scene's one endless ground use the environment terrain.", icon: "mountain", order: 12, enabled: true, defaultVariant: "hills" },
30
30
  ];
31
31
  export const CATALOG_VARIANTS = {
@@ -57,6 +57,7 @@ export const CATALOG_VARIANTS = {
57
57
  { key: "superformula", legacyId: "cd64b779-69da-4afa-98d5-683b48511568", name: "super formula", description: "Super formula mesh", tags: [], config: { type: "superformula", twist1: 0.3, twist2: 0.3, samples: 256, stretchX: 1, stretchY: 1, symmetry: 6, roundness: 0.3 } },
58
58
  { key: "tetrahedron", legacyId: "636570a9-6a6f-11f1-8573-00163e32d101", name: "tetrahedron", description: "4-sided polyhedron (triangular pyramid). Use for d4 dice, simple pyramids, sharp spikes.", tags: ["tetrahedron", "d4", "4-sided", "pyramid", "spike", "triangular-pyramid"], config: { type: "tetrahedron", detail: 0, radius: 0.5 } },
59
59
  { key: "torus", legacyId: "62a28904-6a6f-11f1-8573-00163e32d101", name: "torus", description: "Donut shape — a ring with thickness. Use for donuts, rings, tubes-as-loops.", tags: ["torus", "donut", "doughnut", "ring-thick", "loop"], config: { tube: 0.2, type: "torus", radius: 0.5, radialSegments: 16, tubularSegments: 100 } },
60
+ { key: "text", legacyId: "992fe6fa-0d34-4d07-a600-0acee0c881fa", name: "3d text", description: "A word or line extruded into a solid with bevelled edges, from the same fonts as the text looks; takes any material. Use for logos, signs, titles and chunky labels.", tags: ["text", "3d-text", "extruded", "letters", "logo", "sign", "title"], config: { type: "text", text: "Hello", font: "inter", size: 1, height: 0.2, letterSpacing: 0, bevelEnabled: true, bevelThickness: 0.02, bevelSize: 0.015, bevelSegments: 3 } },
60
61
  ],
61
62
  grid: [
62
63
  { key: "advancedGrid", legacyId: "71h8sjh8-6a6f-gu85-8573-00163e32d101", name: "advanced grid", description: "A Grid with shader material , animation and noise effects.", tags: ["grid"] },
@@ -172,6 +173,7 @@ export const CATALOG_VARIANTS = {
172
173
  { key: "shapeBurst", legacyId: "2843a44a-017f-48b3-bddb-1bc86d891d3b", name: "shapeBurst", description: "Bursts of charged particles that spiral out in a magnetic field and land exactly on a mesh shape, white-hot cooling to two family colours, then dissolve; the cursor detonates, curls or pulls them. Use for reveals, logos and impact moments.", tags: ["burst", "explosion", "reveal", "spirals", "shapes", "magnetic-field", "motion", "interactive"] },
173
174
  { key: "shapeFlow", legacyId: "b4387e34-4641-4731-bcf3-430b16fe53d7", name: "shapeFlow", description: "A wind tunnel of particle streams flowing round an invisible mesh shape: divergence-free flow, wake eddies, streaklines coloured by pressure; the cursor is a second obstacle, a jet or a vortex. Use for tech, aero and product scenes.", tags: ["flow", "wind-tunnel", "streamlines", "aerodynamics", "shapes", "fluid", "science", "interactive"] },
174
175
  { key: "tidalStream", legacyId: "2ecba95c-bb82-42cf-9400-94f53cc579fa", name: "tidalStream", description: "A spiral galaxy shredding dwarf satellites into tidal streams: symplectic orbits, density-wave arms, Doppler-shifted blackbody stars; the cursor is a subhalo, black hole or spectroscope. Use for space scenes.", tags: ["galaxy", "tidal-stream", "n-body", "gravitational-lensing", "black-hole", "doppler", "space", "interactive"] },
176
+ { key: "fireworks", name: "Fireworks", description: "An aerial fireworks show: 20 real shell types, shaped shells, formations and text written in the sky, with drag-limited stars, cooling sparks and lit smoke; fires on its own or where you click. Use for celebrations, New Year and night-sky scenes.", tags: ["fireworks", "celebration", "new-year", "night-sky", "pyrotechnics", "sparks", "interactive"] },
175
177
  ],
176
178
  land: [
177
179
  { key: "mountains", name: "Mountains", description: "A placeable patch of mountain land: ridged, eroded peaks with slope rock and a snow line, easing down to its base at the edge. Footprint is the object's scale. Use for alpine backdrops, islands of peaks and dioramas.", tags: ["land", "terrain", "mountains", "peaks", "alpine", "landscape"], transform: { scale: [5, 1, 5] } },
@@ -186,8 +188,7 @@ export const CATALOG_VARIANTS = {
186
188
  { key: "stars", legacyId: "695c418b-6a6f-11f1-8573-00163e32d101", name: "stars", description: "Stars scattered in the sky", tags: ["stars", "sky", "celestial", "night", "background"], transform: { scale: [500, 500, 500] }, material: { materialType: "particles" } },
187
189
  ],
188
190
  text: [
189
- { key: "2dText", legacyId: "6e49e604-3007-4505-bd87-5e31b1393d94", name: "2d text", description: "2d 'bitmap' text", tags: ["text"], config: { text: "Hello", renderMode: "bitmap" } },
190
- { key: "3dText", legacyId: "992fe6fa-0d34-4d07-a600-0acee0c881fa", name: "3d text", description: "3d text", tags: ["text"], config: { text: "Hello", renderMode: "text3d" } },
191
+ { key: "plain", legacyId: "6e49e604-3007-4505-bd87-5e31b1393d94", name: "Plain", description: "Flat solid text from the font outlines with a weight axis, an optional outline and soft edges, anti-aliased from a signed distance field. Use for labels, captions, prices, menus and titles.", tags: ["plain", "label", "caption", "solid", "flat", "sans", "title", "text"] },
191
192
  { key: "handwriting", name: "Handwriting", description: "A pen writes the text in single strokes, slowing in tight curves where the ink pools and drying from wet sheen to rest colour; a faint sheen drifts over the dry ink. Use for signatures, titles and invitations.", tags: ["handwriting", "ink", "pen", "stroke", "script", "signature", "text"] },
192
193
  { key: "neonTube", name: "Neon Tube", description: "Letter outlines as glass neon tubing: a gas discharge ignites each contour, stuttering before it settles into a steady hum with slow breathing and the odd micro-dip. Use for signs, nightlife and retro titles.", tags: ["neon", "tube", "glow", "sign", "outline", "retro", "text"] },
193
194
  { key: "fourierSketch", name: "Fourier Sketch", description: "Each letter is traced by a chain of rotating circles whose radii are its Fourier coefficients; more terms sharpen the form, and glints keep circling the finished contours. Use for science, math and generative titles.", tags: ["fourier", "epicycle", "circles", "sketch", "trace", "maths", "text"] },
@@ -1 +1 @@
1
- {"version":3,"file":"objectCatalog.d.ts","sourceRoot":"","sources":["../../src/catalog/objectCatalog.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,iBAAiB;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,wEAAwE;IACxE,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,4FAA4F;IAC5F,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,eAAe,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;CACjI;AAuBD,yEAAyE;AACzE,wBAAgB,aAAa,IAAI;IAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAAC,QAAQ,EAAE,oBAAoB,EAAE,CAAA;CAAE,CAuDhG"}
1
+ {"version":3,"file":"objectCatalog.d.ts","sourceRoot":"","sources":["../../src/catalog/objectCatalog.ts"],"names":[],"mappings":"AA0BA,MAAM,WAAW,iBAAiB;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,wEAAwE;IACxE,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,4FAA4F;IAC5F,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,eAAe,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;CACjI;AAsBD,yEAAyE;AACzE,wBAAgB,aAAa,IAAI;IAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAAC,QAAQ,EAAE,oBAAoB,EAAE,CAAA;CAAE,CAsDhG"}
@@ -8,8 +8,7 @@
8
8
  //
9
9
  // registry families effect, particles, grid, light, environment, space, text
10
10
  // → one variant per key of the defaults table (config = that default)
11
- // curated families mesh, gallery → the entries in catalogInfo (configs there); text is both: its curated 2d / 3d
12
- // entries (they carry a config) stay, then one variant per animated look in the registry
11
+ // curated families mesh, gallery → the entries in catalogInfo (configs there)
13
12
  // no variants group, model, path
14
13
  //
15
14
  // Output keeps the shapes the client already uses (ObjectTypeItem /
@@ -32,7 +31,7 @@ const REGISTRY_FAMILIES = {
32
31
  space: { defaults: DEFAULT_SPACE_OBJECTS, labels: SPACE_OBJECT_LABELS },
33
32
  environment: { defaults: DEFAULT_ENVIRONMENT_OBJECTS, labels: ENVIRONMENT_OBJECT_LABELS },
34
33
  land: { defaults: DEFAULT_LAND_OBJECTS, labels: LAND_OBJECT_LABELS },
35
- text: { defaults: DEFAULT_TEXT_OBJECTS, labels: TEXT_OBJECT_LABELS, keepCurated: true },
34
+ text: { defaults: DEFAULT_TEXT_OBJECTS, labels: TEXT_OBJECT_LABELS },
36
35
  };
37
36
  /** 'paw print' → 'Paw Print', 'tunnelPyramid' → 'Tunnel Pyramid'. */
38
37
  const titleCase = (s) => s.replace(/([a-z0-9])([A-Z])/g, '$1 $2').replace(/(^|\s)\S/g, c => c.toUpperCase());
@@ -78,10 +77,6 @@ export function objectCatalog() {
78
77
  const infoBy = new Map(infos.map(i => [i.key, i]));
79
78
  const family = REGISTRY_FAMILIES[type];
80
79
  if (family) {
81
- if (family.keepCurated)
82
- for (const info of infos)
83
- if (info.config && !(info.key in family.defaults))
84
- push(type, info.key, titleCase(info.name), info, info.config);
85
80
  // Catalog order first (what was curated), then any key only the registry has.
86
81
  const keys = [...infos.map(i => i.key).filter(k => k in family.defaults),
87
82
  ...Object.keys(family.defaults).filter(k => !infoBy.has(k))];
@@ -10,18 +10,6 @@ export declare const DEFAULTS_CONFIGS: {
10
10
  turbulence: number;
11
11
  splash: boolean;
12
12
  };
13
- text: {
14
- text: string;
15
- font: string;
16
- renderMode: string;
17
- fontSize: number;
18
- maxWidth: number;
19
- lineHeight: number;
20
- letterSpacing: number;
21
- textAlign: string;
22
- anchorX: string;
23
- anchorY: string;
24
- };
25
13
  grid: {
26
14
  cellSize: number;
27
15
  cellThickness: number;
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/data/defaults.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2E5B,CAAC;AACF,eAAO,MAAM,kBAAkB,EAAE;IACrB,IAAI,EAAE;QACF,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;KACnC,CAAC;IACF,KAAK,EAAE;QACH,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;KACtC,CAAC;IACF,KAAK,EAAE;QACH,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;KACnC,CAAC;IACF,aAAa,EAAE;QACX,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;KACnC,CAAC;IACF,MAAM,EAAE;QACJ,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACnC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;KACtC,CAAC;CAOb,CAAC;AACF,eAAO,MAAM,iBAAiB,EAAE;IACpB,KAAK,EAAE;QACH,YAAY,EAAE,OAAO,CAAC;QACtB,eAAe,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,KAAK,EAAE;QACH,YAAY,EAAE,WAAW,CAAC;KAC7B,CAAC;IACF,MAAM,EAAE;QACJ,YAAY,EAAE,QAAQ,CAAC;QACvB,eAAe,EAAE,MAAM,CAAC;KAC3B,CAAC;CAeb,CAAC"}
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/data/defaults.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+D5B,CAAC;AACF,eAAO,MAAM,kBAAkB,EAAE;IACrB,IAAI,EAAE;QACF,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;KACnC,CAAC;IACF,KAAK,EAAE;QACH,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;KACtC,CAAC;IACF,KAAK,EAAE;QACH,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;KACnC,CAAC;IACF,aAAa,EAAE;QACX,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;KACnC,CAAC;IACF,MAAM,EAAE;QACJ,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACnC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;KACtC,CAAC;CAOb,CAAC;AACF,eAAO,MAAM,iBAAiB,EAAE;IACpB,KAAK,EAAE;QACH,YAAY,EAAE,OAAO,CAAC;QACtB,eAAe,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,KAAK,EAAE;QACH,YAAY,EAAE,WAAW,CAAC;KAC7B,CAAC;IACF,MAAM,EAAE;QACJ,YAAY,EAAE,QAAQ,CAAC;QACvB,eAAe,EAAE,MAAM,CAAC;KAC3B,CAAC;CAeb,CAAC"}
@@ -11,18 +11,6 @@ export const DEFAULTS_CONFIGS = {
11
11
  turbulence: 0,
12
12
  splash: false,
13
13
  },
14
- text: {
15
- text: 'New Text',
16
- font: 'Arial',
17
- renderMode: 'bitmap',
18
- fontSize: 1,
19
- maxWidth: 10,
20
- lineHeight: 1,
21
- letterSpacing: 0,
22
- textAlign: 'center',
23
- anchorX: 'center',
24
- anchorY: 'middle',
25
- },
26
14
  grid: {
27
15
  cellSize: 1,
28
16
  cellThickness: 1,
@@ -1 +1 @@
1
- {"version":3,"file":"particlesDefaults.d.ts","sourceRoot":"","sources":["../../src/data/particlesDefaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAK3H,eAAO,MAAM,4BAA4B,EAAE,MAAM,CAAC,uBAAuB,EAAE,yBAAyB,CAYnG,CAAC;AAEF,eAAO,MAAM,2BAA2B,EAAE,MAAM,CAAC,uBAAuB,EAAE,MAAM,CAY/E,CAAC;AAEF,gGAAgG;AAChG,eAAO,MAAM,+BAA+B,EAAE,MAAM,CAAC,uBAAuB,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,CAoN/G,CAAC;AAMF,eAAO,MAAM,oBAAoB,EAAE,SAAS,iBAAiB,EAA0H,CAAC;AAExL,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,iBAAiB,EAAE,mBAAmB,CAWlF,CAAC;AAEF,8GAA8G;AAC9G,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,yBAAyB,CAGhG"}
1
+ {"version":3,"file":"particlesDefaults.d.ts","sourceRoot":"","sources":["../../src/data/particlesDefaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAK3H,eAAO,MAAM,4BAA4B,EAAE,MAAM,CAAC,uBAAuB,EAAE,yBAAyB,CAanG,CAAC;AAEF,eAAO,MAAM,2BAA2B,EAAE,MAAM,CAAC,uBAAuB,EAAE,MAAM,CAa/E,CAAC;AAEF,gGAAgG;AAChG,eAAO,MAAM,+BAA+B,EAAE,MAAM,CAAC,uBAAuB,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,CA6O/G,CAAC;AAMF,eAAO,MAAM,oBAAoB,EAAE,SAAS,iBAAiB,EAA0H,CAAC;AAExL,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,iBAAiB,EAAE,mBAAmB,CAWlF,CAAC;AAEF,8GAA8G;AAC9G,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,yBAAyB,CAGhG"}
@@ -13,6 +13,7 @@ export const DEFAULT_GENERATIVE_PARTICLES = {
13
13
  magneticBottle: { type: 'magneticBottle', enabled: true, intensity: 1, speed: 1, opacity: 0.9, size: 1, color: '#5fd6ff', particleCount: 48, shape: { type: 'cone', radius: 0.5, height: 1, radialSegments: 32 }, windings: 0.6, pitchSpread: 0.3, lineLife: 6, lineDensity: 1, counterColor: '#ff6fb3', glow: 1, seed: 1, quality: 'medium', pointerMode: 'drift', pointerStrength: 1, pointerRadius: 1, pointerColor: '#fff0c8', trailMode: 'comet', trailLength: 0.8, trailOpacity: 0.8, trailColor: '#8f7bff', trailShare: 1 },
14
14
  shapeBurst: { type: 'shapeBurst', enabled: true, intensity: 1, speed: 1, opacity: 0.9, size: 1, color: '#45d1ff', particleCount: 180, shape: { type: 'icosahedron', radius: 0.5, detail: 0 }, interval: 2.8, formSpeed: 2.4, fieldStrength: 1, holdTime: 1.2, dissolve: 0.3, counterColor: '#ff5aa8', heatColor: '#fff6e0', headSize: 1.4, seed: 1, quality: 'medium', pointerMode: 'detonate', pointerStrength: 1, pointerRadius: 1, pointerColor: '#ffffff', trailMode: 'comet', trailLength: 0.4, trailOpacity: 0.8, trailColor: '#6a5cff', trailShare: 0.5 },
15
15
  shapeFlow: { type: 'shapeFlow', enabled: true, intensity: 1, speed: 1, opacity: 0.9, size: 1, color: '#3f7bff', particleCount: 2400, shape: { type: 'sphere', radius: 0.5, segments: 32, rings: 32 }, flowSpeed: 1, windPitch: 0, rake: 'sheet', lanes: 44, streamWidth: 0.85, turbulence: 0.9, fastColor: '#ff6a3d', headSize: 1, seed: 1, quality: 'medium', pointerMode: 'obstacle', pointerStrength: 1, pointerRadius: 1, pointerColor: '#ffffff', trailMode: 'comet', trailLength: 1.2, trailOpacity: 0.7, trailColor: '#1b2a6b', trailShare: 1 },
16
+ fireworks: { type: 'fireworks', enabled: true, intensity: 1, speed: 1, opacity: 1, size: 1, color: '#ff3b30', secondColor: '#43e86b', accentColor: '#3f7dff', sparkColor: '#ffc27a', particleCount: 14000, shellType: 'mix', launchRate: 1, burstSize: 1, burstHeight: 1, burnTime: 1, spread: 1, wind: 0.15, smoke: 0.6, randomFire: true, fireOnClick: false, formation: 'none', formationCount: 9, formationSize: 1, textMode: 'letters', text: 'HAPPY NEW YEAR', textSize: 1, seed: 1, quality: 'medium', pointerMode: 'aim', pointerStrength: 1, pointerRadius: 1, pointerColor: '#fff1c9', trailMode: 'comet', trailLength: 1.2, trailOpacity: 0.7, trailColor: '#ffae6b', trailShare: 1 },
16
17
  };
17
18
  export const GENERATIVE_PARTICLES_LABELS = {
18
19
  tidalStream: 'Tidal Stream',
@@ -26,6 +27,7 @@ export const GENERATIVE_PARTICLES_LABELS = {
26
27
  magneticBottle: 'Magnetic Bottle',
27
28
  shapeBurst: 'Shape Burst',
28
29
  shapeFlow: 'Shape Flow',
30
+ fireworks: 'Fireworks',
29
31
  };
30
32
  /** Knobs the animation / mouse-move systems may drive per frame (see GENERATIVE_ANIMATABLE). */
31
33
  export const GENERATIVE_PARTICLES_ANIMATABLE = {
@@ -240,6 +242,31 @@ export const GENERATIVE_PARTICLES_ANIMATABLE = {
240
242
  { value: 'trailOpacity', label: 'Trail Opacity' },
241
243
  { value: 'trailColor', label: 'Trail Color' },
242
244
  ],
245
+ fireworks: [
246
+ { value: 'intensity', label: 'Intensity' },
247
+ { value: 'speed', label: 'Speed' },
248
+ { value: 'opacity', label: 'Opacity' },
249
+ { value: 'color', label: 'Color' },
250
+ { value: 'textSize', label: 'Text Size' },
251
+ { value: 'formationCount', label: 'Formation Count' },
252
+ { value: 'formationSize', label: 'Formation Size' },
253
+ { value: 'launchRate', label: 'Launch Rate' },
254
+ { value: 'burstSize', label: 'Burst Size' },
255
+ { value: 'burstHeight', label: 'Burst Height' },
256
+ { value: 'burnTime', label: 'Burn Time' },
257
+ { value: 'spread', label: 'Spread' },
258
+ { value: 'wind', label: 'Wind' },
259
+ { value: 'smoke', label: 'Smoke' },
260
+ { value: 'secondColor', label: 'Second Color' },
261
+ { value: 'accentColor', label: 'Accent Color' },
262
+ { value: 'sparkColor', label: 'Spark Color' },
263
+ { value: 'pointerStrength', label: 'Pointer Strength' },
264
+ { value: 'pointerRadius', label: 'Pointer Radius' },
265
+ { value: 'pointerColor', label: 'Pointer Color' },
266
+ { value: 'trailLength', label: 'Trail Length' },
267
+ { value: 'trailOpacity', label: 'Trail Opacity' },
268
+ { value: 'trailColor', label: 'Trail Color' },
269
+ ],
243
270
  };
244
271
  // =============================================================================
245
272
  // PARTICLE SHAPES — the `shape` config of shape-driven particle objects (magneticBottle,
@@ -11,6 +11,6 @@ export declare const TEXT_FONTS: ReadonlyArray<{
11
11
  label: string;
12
12
  family: string;
13
13
  }>;
14
- /** True when the config is one of the text looks (type 'text', config.type set; the legacy text has no config.type). */
14
+ /** True when the config is one of the text looks (object type 'text', config.type set). */
15
15
  export declare function isTextObjectConfig(config: unknown): config is TextObjectConfig;
16
16
  //# sourceMappingURL=textDefaults.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"textDefaults.d.ts","sourceRoot":"","sources":["../../src/data/textDefaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAYjE,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,cAAc,EAAE,gBAAgB,CAazE,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAa7D,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,cAAc,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,CAyI9F,CAAC;AAEF,kHAAkH;AAClH,eAAO,MAAM,UAAU,EAAE,aAAa,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAiBnF,CAAC;AAEF,wHAAwH;AACxH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,gBAAgB,CAG9E"}
1
+ {"version":3,"file":"textDefaults.d.ts","sourceRoot":"","sources":["../../src/data/textDefaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAYjE,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,cAAc,EAAE,gBAAgB,CAczE,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAc7D,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,cAAc,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,CAkJ9F,CAAC;AAEF,kHAAkH;AAClH,eAAO,MAAM,UAAU,EAAE,aAAa,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CA0BnF,CAAC;AAEF,2FAA2F;AAC3F,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,gBAAgB,CAG9E"}
@@ -8,18 +8,19 @@
8
8
  // the playback timings are never listed.
9
9
  //
10
10
  export const DEFAULT_TEXT_OBJECTS = {
11
- handwriting: { type: 'handwriting', enabled: true, text: 'Hello, world', font: 'caveat', drawMethod: 'pen', drawDuration: 5, drawEase: 'easeInOut', drawStagger: 0.6, drawAngle: 0, eraseMethod: 'fade', eraseDuration: 2, eraseEase: 'easeInOut', eraseStagger: 0.6, eraseAngle: 0, autoPlay: true, loop: false, yoyo: false, holdTime: 2, hiddenTime: 0.5, color: '#efe6d2', color2: '#ffd9a0', weight: 1, wetTime: 1.1, sheen: 0.35, opacity: 1, penGlow: 1 },
12
- neonTube: { type: 'neonTube', enabled: true, text: 'Hello, world', font: 'caveat', drawMethod: 'trace', drawDuration: 5, drawEase: 'easeInOut', drawStagger: 0.6, drawAngle: 0, eraseMethod: 'undraw', eraseDuration: 2, eraseEase: 'easeInOut', eraseStagger: 0.6, eraseAngle: 0, autoPlay: true, loop: false, yoyo: false, holdTime: 2, hiddenTime: 0.5, color: '#ff2f9a', color2: '#ffd2ec', tube: 0.04, core: 0.22, glow: 1, flicker: 1, offLevel: 0.07, opacity: 1 },
13
- fourierSketch: { type: 'fourierSketch', enabled: true, text: 'Hello, world', font: 'caveat', drawMethod: 'epicycle', drawDuration: 5, drawEase: 'easeInOut', drawStagger: 0.6, drawAngle: 0, eraseMethod: 'fade', eraseDuration: 2, eraseEase: 'easeInOut', eraseStagger: 0.6, eraseAngle: 0, autoPlay: true, loop: false, yoyo: false, holdTime: 2, hiddenTime: 0.5, color: '#5fd0ff', color2: '#fff1c2', line: 0.03, terms: 96, circles: 1, trail: 0.9, bridges: 0.14, glint: 1, opacity: 1 },
14
- frostGrowth: { type: 'frostGrowth', enabled: true, text: 'Hello, world', font: 'caveat', drawMethod: 'grow', drawDuration: 6, drawEase: 'linear', drawStagger: 0.6, drawAngle: 0, eraseMethod: 'sublimate', eraseDuration: 3, eraseEase: 'linear', eraseStagger: 0.6, eraseAngle: 0, autoPlay: true, loop: false, yoyo: false, holdTime: 2, hiddenTime: 0.5, reach: 0.15, branching: 1, grains: 5, sparkle: 0.6, thickness: 1, seams: 0.75, haze: 0.5, seed: 7, color: '#d6edff', color2: '#4a90d4', opacity: 1 },
15
- plasmaDischarge: { type: 'plasmaDischarge', enabled: true, text: 'Hello, world', font: 'caveat', drawMethod: 'strike', drawDuration: 5, drawEase: 'easeInOut', drawStagger: 0.6, drawAngle: 0, eraseMethod: 'undraw', eraseDuration: 2, eraseEase: 'easeInOut', eraseStagger: 0.6, eraseAngle: 0, autoPlay: true, loop: false, yoyo: false, holdTime: 2, hiddenTime: 0.5, branches: 0.72, reach: 0.55, branchiness: 0.6, pulse: 0.8, glow: 1, spectrum: 0.5, core: 0.0065, color: '#6c3dff', color2: '#a9ceff', opacity: 1, seed: 7 },
16
- burnAway: { type: 'burnAway', enabled: true, text: 'Hello, world', font: 'caveat', drawMethod: 'trace', drawDuration: 5, drawEase: 'easeInOut', drawStagger: 0.6, drawAngle: 0, eraseMethod: 'burn', eraseDuration: 6, eraseEase: 'linear', eraseStagger: 0.6, eraseAngle: 0, autoPlay: true, loop: false, yoyo: false, holdTime: 2.5, hiddenTime: 0.5, color: '#efe2c4', color2: '#ff7a1c', char: 0.6, ashLace: 0.7, curl: 0.6, spread: 1, ember: 1, roughness: 0.6, singe: 0.55, opacity: 1, seed: 7 },
17
- lightPainting: { type: 'lightPainting', enabled: true, text: 'Hello, world', font: 'caveat', drawMethod: 'pen', drawDuration: 5, drawEase: 'easeInOut', drawStagger: 0.6, drawAngle: 0, eraseMethod: 'pen', eraseDuration: 2, eraseEase: 'easeInOut', eraseStagger: 0.6, eraseAngle: 0, autoPlay: true, loop: false, yoyo: false, holdTime: 2, hiddenTime: 0.5, exposure: 1, temperature: 3000, sparks: 110, spread: 0.7, bloom: 1, width: 0.012, strobe: 0, halation: 0.55, tremor: 0.5, color: '#ffe0b0', color2: '#ffffff', opacity: 1 },
18
- constellation: { type: 'constellation', enabled: true, text: 'Hello, world', font: 'caveat', drawMethod: 'pen', drawDuration: 5, drawEase: 'easeInOut', drawStagger: 0.6, drawAngle: 0, eraseMethod: 'undraw', eraseDuration: 2, eraseEase: 'easeInOut', eraseStagger: 0.6, eraseAngle: 0, autoPlay: true, loop: false, yoyo: false, holdTime: 2, hiddenTime: 0.5, stars: 5.5, brightness: 0, twinkle: 1, lines: 1, temperature: 0, seed: 7, color: '#7f9bd0', color2: '#dce8ff', opacity: 1 },
19
- inkBleed: { type: 'inkBleed', enabled: true, text: 'Hello, world', font: 'caveat', drawMethod: 'pen', drawDuration: 5, drawEase: 'easeInOut', drawStagger: 0.6, drawAngle: 0, eraseMethod: 'burn', eraseDuration: 6, eraseEase: 'linear', eraseStagger: 0.6, eraseAngle: 0, autoPlay: true, loop: false, yoyo: false, holdTime: 2.5, hiddenTime: 0.5, color: '#1b2d6a', color2: '#b0703c', bleed: 0.042, dryTime: 2.4, fibre: 0.7, pooling: 0.7, weight: 0.7, paper: 1, oxidation: 3.5, burn: 0.6, char: 0.6, spread: 1, opacity: 1 },
20
- liquidMetal: { type: 'liquidMetal', enabled: true, text: 'Hello, world', font: 'caveat', drawMethod: 'flow', drawDuration: 5, drawEase: 'easeInOut', drawStagger: 0.6, drawAngle: 0, eraseMethod: 'melt', eraseDuration: 4.5, eraseEase: 'linear', eraseStagger: 0.6, eraseAngle: 0, autoPlay: true, loop: false, yoyo: false, holdTime: 2, hiddenTime: 0.5, thickness: 0.06, roughness: 1, reflectivity: 0.8, environment: 1.15, tint: 0.7, rippleSpeed: 1, oxide: 0.4, spikes: 0, melt: 0.5, drips: 0.6, color: '#cdd5df', color2: '#f4f7ff', opacity: 1 },
21
- embroidery: { type: 'embroidery', enabled: true, text: 'Hello, world', font: 'caveat', drawMethod: 'stitch', drawDuration: 5, drawEase: 'easeInOut', drawStagger: 0.6, drawAngle: 0, eraseMethod: 'undraw', eraseDuration: 2, eraseEase: 'easeInOut', eraseStagger: 0.6, eraseAngle: 0, autoPlay: true, loop: false, yoyo: false, holdTime: 2, hiddenTime: 0.5, color: '#c92f48', color2: '#e8c47a', density: 44, slant: 66, thickness: 1.35, sheen: 1, relief: 1, outline: 0.65, fabric: 0.4, pucker: 0.6, style: 'auto', opacity: 1 },
22
- chalkboard: { type: 'chalkboard', enabled: true, text: 'Hello, world', font: 'caveat', drawMethod: 'pen', drawDuration: 5, drawEase: 'easeInOut', drawStagger: 0.6, drawAngle: 0, eraseMethod: 'smudge', eraseDuration: 2, eraseEase: 'easeInOut', eraseStagger: 0.6, eraseAngle: 0, autoPlay: true, loop: false, yoyo: false, holdTime: 2, hiddenTime: 0.5, pressure: 0.55, chatter: 0.6, grain: 0.55, weight: 1, dust: 0.6, ghost: 0.5, swing: 0.6, board: 0, opacity: 1, color: '#ebe6d8', color2: '#c4dcf2' },
11
+ handwriting: { type: 'handwriting', shown: true, text: 'Hello, world', font: 'caveat', drawMethod: 'pen', drawDuration: 5, drawEase: 'easeInOut', drawStagger: 0.6, drawAngle: 0, eraseMethod: 'fade', eraseDuration: 2, eraseEase: 'easeInOut', eraseStagger: 0.6, eraseAngle: 0, autoPlay: true, loop: false, yoyo: false, holdTime: 2, hiddenTime: 0.5, color: '#efe6d2', color2: '#ffd9a0', weight: 1, wetTime: 1.1, sheen: 0.35, opacity: 1, penGlow: 1 },
12
+ neonTube: { type: 'neonTube', shown: true, text: 'Hello, world', font: 'caveat', drawMethod: 'trace', drawDuration: 5, drawEase: 'easeInOut', drawStagger: 0.6, drawAngle: 0, eraseMethod: 'undraw', eraseDuration: 2, eraseEase: 'easeInOut', eraseStagger: 0.6, eraseAngle: 0, autoPlay: true, loop: false, yoyo: false, holdTime: 2, hiddenTime: 0.5, color: '#ff2f9a', color2: '#ffd2ec', tube: 0.04, core: 0.22, glow: 1, flicker: 1, offLevel: 0.07, opacity: 1 },
13
+ fourierSketch: { type: 'fourierSketch', shown: true, text: 'Hello, world', font: 'caveat', drawMethod: 'epicycle', drawDuration: 5, drawEase: 'easeInOut', drawStagger: 0.6, drawAngle: 0, eraseMethod: 'fade', eraseDuration: 2, eraseEase: 'easeInOut', eraseStagger: 0.6, eraseAngle: 0, autoPlay: true, loop: false, yoyo: false, holdTime: 2, hiddenTime: 0.5, color: '#5fd0ff', color2: '#fff1c2', line: 0.03, terms: 96, circles: 1, trail: 0.9, bridges: 0.14, glint: 1, opacity: 1 },
14
+ frostGrowth: { type: 'frostGrowth', shown: true, text: 'Hello, world', font: 'caveat', drawMethod: 'grow', drawDuration: 6, drawEase: 'linear', drawStagger: 0.6, drawAngle: 0, eraseMethod: 'sublimate', eraseDuration: 3, eraseEase: 'linear', eraseStagger: 0.6, eraseAngle: 0, autoPlay: true, loop: false, yoyo: false, holdTime: 2, hiddenTime: 0.5, reach: 0.15, branching: 1, grains: 5, sparkle: 0.6, thickness: 1, seams: 0.75, haze: 0.5, seed: 7, color: '#d6edff', color2: '#4a90d4', opacity: 1 },
15
+ plasmaDischarge: { type: 'plasmaDischarge', shown: true, text: 'Hello, world', font: 'caveat', drawMethod: 'strike', drawDuration: 5, drawEase: 'easeInOut', drawStagger: 0.6, drawAngle: 0, eraseMethod: 'undraw', eraseDuration: 2, eraseEase: 'easeInOut', eraseStagger: 0.6, eraseAngle: 0, autoPlay: true, loop: false, yoyo: false, holdTime: 2, hiddenTime: 0.5, branches: 0.72, reach: 0.55, branchiness: 0.6, pulse: 0.8, glow: 1, spectrum: 0.5, core: 0.0065, color: '#6c3dff', color2: '#a9ceff', opacity: 1, seed: 7 },
16
+ burnAway: { type: 'burnAway', shown: true, text: 'Hello, world', font: 'caveat', drawMethod: 'trace', drawDuration: 5, drawEase: 'easeInOut', drawStagger: 0.6, drawAngle: 0, eraseMethod: 'burn', eraseDuration: 6, eraseEase: 'linear', eraseStagger: 0.6, eraseAngle: 0, autoPlay: true, loop: false, yoyo: false, holdTime: 2.5, hiddenTime: 0.5, color: '#efe2c4', color2: '#ff7a1c', char: 0.6, ashLace: 0.7, curl: 0.6, spread: 1, ember: 1, roughness: 0.6, singe: 0.55, opacity: 1, seed: 7 },
17
+ lightPainting: { type: 'lightPainting', shown: true, text: 'Hello, world', font: 'caveat', drawMethod: 'pen', drawDuration: 5, drawEase: 'easeInOut', drawStagger: 0.6, drawAngle: 0, eraseMethod: 'pen', eraseDuration: 2, eraseEase: 'easeInOut', eraseStagger: 0.6, eraseAngle: 0, autoPlay: true, loop: false, yoyo: false, holdTime: 2, hiddenTime: 0.5, exposure: 1, temperature: 3000, sparks: 110, spread: 0.7, bloom: 1, width: 0.012, strobe: 0, halation: 0.55, tremor: 0.5, color: '#ffe0b0', color2: '#ffffff', opacity: 1 },
18
+ constellation: { type: 'constellation', shown: true, text: 'Hello, world', font: 'caveat', drawMethod: 'pen', drawDuration: 5, drawEase: 'easeInOut', drawStagger: 0.6, drawAngle: 0, eraseMethod: 'undraw', eraseDuration: 2, eraseEase: 'easeInOut', eraseStagger: 0.6, eraseAngle: 0, autoPlay: true, loop: false, yoyo: false, holdTime: 2, hiddenTime: 0.5, stars: 5.5, brightness: 0, twinkle: 1, lines: 1, temperature: 0, seed: 7, color: '#7f9bd0', color2: '#dce8ff', opacity: 1 },
19
+ inkBleed: { type: 'inkBleed', shown: true, text: 'Hello, world', font: 'caveat', drawMethod: 'pen', drawDuration: 5, drawEase: 'easeInOut', drawStagger: 0.6, drawAngle: 0, eraseMethod: 'burn', eraseDuration: 6, eraseEase: 'linear', eraseStagger: 0.6, eraseAngle: 0, autoPlay: true, loop: false, yoyo: false, holdTime: 2.5, hiddenTime: 0.5, color: '#1b2d6a', color2: '#b0703c', bleed: 0.042, dryTime: 2.4, fibre: 0.7, pooling: 0.7, weight: 0.7, paper: 1, oxidation: 3.5, burn: 0.6, char: 0.6, spread: 1, opacity: 1 },
20
+ liquidMetal: { type: 'liquidMetal', shown: true, text: 'Hello, world', font: 'caveat', drawMethod: 'flow', drawDuration: 5, drawEase: 'easeInOut', drawStagger: 0.6, drawAngle: 0, eraseMethod: 'melt', eraseDuration: 4.5, eraseEase: 'linear', eraseStagger: 0.6, eraseAngle: 0, autoPlay: true, loop: false, yoyo: false, holdTime: 2, hiddenTime: 0.5, thickness: 0.06, roughness: 1, reflectivity: 0.8, environment: 1.15, tint: 0.7, rippleSpeed: 1, oxide: 0.4, spikes: 0, melt: 0.5, drips: 0.6, color: '#cdd5df', color2: '#f4f7ff', opacity: 1 },
21
+ embroidery: { type: 'embroidery', shown: true, text: 'Hello, world', font: 'caveat', drawMethod: 'stitch', drawDuration: 5, drawEase: 'easeInOut', drawStagger: 0.6, drawAngle: 0, eraseMethod: 'undraw', eraseDuration: 2, eraseEase: 'easeInOut', eraseStagger: 0.6, eraseAngle: 0, autoPlay: true, loop: false, yoyo: false, holdTime: 2, hiddenTime: 0.5, color: '#c92f48', color2: '#e8c47a', density: 44, slant: 66, thickness: 1.35, sheen: 1, relief: 1, outline: 0.65, fabric: 0.4, pucker: 0.6, style: 'auto', opacity: 1 },
22
+ chalkboard: { type: 'chalkboard', shown: true, text: 'Hello, world', font: 'caveat', drawMethod: 'pen', drawDuration: 5, drawEase: 'easeInOut', drawStagger: 0.6, drawAngle: 0, eraseMethod: 'smudge', eraseDuration: 2, eraseEase: 'easeInOut', eraseStagger: 0.6, eraseAngle: 0, autoPlay: true, loop: false, yoyo: false, holdTime: 2, hiddenTime: 0.5, pressure: 0.55, chatter: 0.6, grain: 0.55, weight: 1, dust: 0.6, ghost: 0.5, swing: 0.6, board: 0, opacity: 1, color: '#ebe6d8', color2: '#c4dcf2' },
23
+ plain: { type: 'plain', shown: true, text: 'Hello', font: 'inter', drawMethod: 'fade', drawDuration: 1.2, drawEase: 'easeInOut', drawStagger: 0.6, drawAngle: 0, eraseMethod: 'fade', eraseDuration: 0.8, eraseEase: 'easeInOut', eraseStagger: 0.6, eraseAngle: 0, autoPlay: true, loop: false, yoyo: false, holdTime: 2, hiddenTime: 0.5, color: '#ffffff', color2: '#111111', weight: 0, outline: 0, fill: 1, softness: 0, opacity: 1 },
23
24
  };
24
25
  export const TEXT_OBJECT_LABELS = {
25
26
  handwriting: 'Handwriting',
@@ -34,6 +35,7 @@ export const TEXT_OBJECT_LABELS = {
34
35
  liquidMetal: 'Liquid Metal',
35
36
  embroidery: 'Embroidery',
36
37
  chalkboard: 'Chalkboard',
38
+ plain: 'Plain',
37
39
  };
38
40
  export const TEXT_OBJECTS_ANIMATABLE = {
39
41
  handwriting: [
@@ -172,9 +174,28 @@ export const TEXT_OBJECTS_ANIMATABLE = {
172
174
  { value: 'color', label: 'Chalk' },
173
175
  { value: 'color2', label: 'Highlight' },
174
176
  ],
177
+ plain: [
178
+ { value: 'color', label: 'Colour' },
179
+ { value: 'weight', label: 'Weight' },
180
+ { value: 'outline', label: 'Outline' },
181
+ { value: 'opacity', label: 'Opacity' },
182
+ { value: 'color2', label: 'Outline colour' },
183
+ { value: 'fill', label: 'Fill' },
184
+ { value: 'softness', label: 'Softness' },
185
+ ],
175
186
  };
176
187
  /** The typefaces every look can use: the id is stored, the family is the Google Fonts name used to preview it. */
177
188
  export const TEXT_FONTS = [
189
+ // clean text faces (plain labels, mesh text)
190
+ { id: 'inter', label: 'Inter', family: 'Inter' },
191
+ { id: 'roboto', label: 'Roboto', family: 'Roboto' },
192
+ { id: 'montserrat', label: 'Montserrat', family: 'Montserrat' },
193
+ { id: 'poppins', label: 'Poppins', family: 'Poppins' },
194
+ { id: 'oswald', label: 'Oswald', family: 'Oswald' },
195
+ { id: 'bebas-neue', label: 'Bebas Neue', family: 'Bebas Neue' },
196
+ { id: 'playfair-display', label: 'Playfair Display', family: 'Playfair Display' },
197
+ { id: 'lora', label: 'Lora', family: 'Lora' },
198
+ // handwriting faces (the pen looks)
178
199
  { id: 'caveat', label: 'Caveat', family: 'Caveat' },
179
200
  { id: 'kalam', label: 'Kalam', family: 'Kalam' },
180
201
  { id: 'handlee', label: 'Handlee', family: 'Handlee' },
@@ -190,9 +211,8 @@ export const TEXT_FONTS = [
190
211
  { id: 'kaushan-script', label: 'Kaushan Script', family: 'Kaushan Script' },
191
212
  { id: 'sriracha', label: 'Sriracha', family: 'Sriracha' },
192
213
  { id: 'pacifico', label: 'Pacifico', family: 'Pacifico' },
193
- { id: 'poppins', label: 'Poppins', family: 'Poppins' },
194
214
  ];
195
- /** True when the config is one of the text looks (type 'text', config.type set; the legacy text has no config.type). */
215
+ /** True when the config is one of the text looks (object type 'text', config.type set). */
196
216
  export function isTextObjectConfig(config) {
197
217
  const t = config?.type;
198
218
  return typeof t === 'string' && Object.prototype.hasOwnProperty.call(DEFAULT_TEXT_OBJECTS, t);
@@ -282,7 +282,10 @@ export interface TerrainPropertySchema {
282
282
  description: string;
283
283
  advanced?: boolean;
284
284
  /** false = structural: set only (controllers, action patches), never driven per
285
- * frame (timeline, mouse-move, AI clips). Absent = numbers / colours animate. */
285
+ * frame (timeline, mouse-move, AI clips) — the integer counts (octaves, strata).
286
+ * Absent = numbers / colours animate: every shape and surface knob is a uniform
287
+ * read by the vertex / fragment shader each frame, so a clip can grow a mountain
288
+ * or move the sea level smoothly. */
286
289
  animatable?: boolean;
287
290
  /** Only show for these terrain types. Absent means all. */
288
291
  types?: TerrainType[];
@@ -1 +1 @@
1
- {"version":3,"file":"terrainConfigs.d.ts","sourceRoot":"","sources":["../../src/environment/terrainConfigs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"terrainConfigs.d.ts","sourceRoot":"","sources":["../../src/environment/terrainConfigs.ts"],"names":[],"mappings":"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"}
@@ -245,41 +245,41 @@ export const TERRAIN_DEFAULTS = {
245
245
  canyon: defaultCanyonConfig,
246
246
  };
247
247
  export const TERRAIN_SCHEMA = [
248
- { key: 'elevation', animatable: false, label: 'Elevation', group: 'form', min: 5, max: 6000, step: 5, unit: 'm', description: 'Peak height above sea level. Every height-keyed splat threshold is a fraction of this, so raising it does not move the snow line.' },
249
- { key: 'seaLevel', animatable: false, label: 'Sea level', group: 'form', min: -2000, max: 2000, step: 5, unit: 'm', description: 'World Y the terrain is built around — where flat ground sits, and where a placed object meets it.' },
250
- { key: 'featureSize', animatable: false, label: 'Feature size', group: 'form', min: 200, max: 40000, step: 50, unit: 'm', description: 'Horizontal size of the primary landform. The one knob that decides whether this reads as a mountain range or a gravel pile.' },
248
+ { key: 'elevation', label: 'Elevation', group: 'form', min: 5, max: 6000, step: 5, unit: 'm', description: 'Peak height above sea level. Every height-keyed splat threshold is a fraction of this, so raising it does not move the snow line.' },
249
+ { key: 'seaLevel', label: 'Sea level', group: 'form', min: -2000, max: 2000, step: 5, unit: 'm', description: 'World Y the terrain is built around — where flat ground sits, and where a placed object meets it.' },
250
+ { key: 'featureSize', label: 'Feature size', group: 'form', min: 200, max: 40000, step: 50, unit: 'm', description: 'Horizontal size of the primary landform. The one knob that decides whether this reads as a mountain range or a gravel pile.' },
251
251
  { key: 'octaves', animatable: false, label: 'Octaves', group: 'form', min: 3, max: 12, step: 1, description: 'fBm detail levels. Past ~10 the extra octaves are finer than the closest clipmap cell and only cost; distant rings drop them automatically.' },
252
- { key: 'lacunarity', animatable: false, label: 'Lacunarity', group: 'form', min: 1.7, max: 2.6, step: 0.01, advanced: true, description: 'Frequency step per octave. Slightly off 2.0 breaks the grid alignment that otherwise shows as a faint square lattice.' },
253
- { key: 'gain', animatable: false, label: 'Gain', group: 'form', min: 0.25, max: 0.72, step: 0.005, description: 'Amplitude step per octave. Below 0.5 smooth and rolling, above it jagged and fractal.' },
254
- { key: 'ridgeSharpness', animatable: false, label: 'Ridge sharpness', group: 'form', min: 0, max: 1, step: 0.005, description: '0 gives rounded billow hills, 1 knife ridges. The strongest single cue between a mountain and a dune field.' },
255
- { key: 'warpStrength', animatable: false, label: 'Domain warp', group: 'form', min: 0, max: 1, step: 0.005, description: 'Bends ridge lines into curved, branching shapes. At 0 the silhouette reads as noise rather than landscape.' },
256
- { key: 'warpSize', animatable: false, label: 'Warp size', group: 'form', min: 0.1, max: 2, step: 0.01, advanced: true, description: 'Scale of the warp field relative to feature size. Above ~1 it drifts the terrain instead of bending it.' },
257
- { key: 'erosion', animatable: false, label: 'Erosion', group: 'form', min: 0, max: 1, step: 0.005, description: 'Damps octaves where slope is already steep — flattens valley floors, sharpens flanks. The cheapest approximation of erosion there is.' },
252
+ { key: 'lacunarity', label: 'Lacunarity', group: 'form', min: 1.7, max: 2.6, step: 0.01, advanced: true, description: 'Frequency step per octave. Slightly off 2.0 breaks the grid alignment that otherwise shows as a faint square lattice.' },
253
+ { key: 'gain', label: 'Gain', group: 'form', min: 0.25, max: 0.72, step: 0.005, description: 'Amplitude step per octave. Below 0.5 smooth and rolling, above it jagged and fractal.' },
254
+ { key: 'ridgeSharpness', label: 'Ridge sharpness', group: 'form', min: 0, max: 1, step: 0.005, description: '0 gives rounded billow hills, 1 knife ridges. The strongest single cue between a mountain and a dune field.' },
255
+ { key: 'warpStrength', label: 'Domain warp', group: 'form', min: 0, max: 1, step: 0.005, description: 'Bends ridge lines into curved, branching shapes. At 0 the silhouette reads as noise rather than landscape.' },
256
+ { key: 'warpSize', label: 'Warp size', group: 'form', min: 0.1, max: 2, step: 0.01, advanced: true, description: 'Scale of the warp field relative to feature size. Above ~1 it drifts the terrain instead of bending it.' },
257
+ { key: 'erosion', label: 'Erosion', group: 'form', min: 0, max: 1, step: 0.005, description: 'Damps octaves where slope is already steep — flattens valley floors, sharpens flanks. The cheapest approximation of erosion there is.' },
258
258
  { key: 'terraces', animatable: false, label: 'Strata', group: 'form', min: 0, max: 40, step: 1, types: ['canyon', 'mountains'], description: 'Sedimentary banding step count. 0 is off. Most of what makes a mesa read as a mesa.' },
259
- { key: 'terraceSharpness', animatable: false, label: 'Strata hardness', group: 'form', min: 0, max: 1, step: 0.01, types: ['canyon', 'mountains'], description: '0 is a smooth ramp between bands, 1 a near-vertical riser.' },
260
- { key: 'plateau', animatable: false, label: 'Plateau', group: 'form', min: 0, max: 1, step: 0.005, types: ['canyon'], description: 'Fraction of the height range flattened into mesa tops.' },
261
- { key: 'valleyDepth', animatable: false, label: 'Incision depth', group: 'form', min: 0, max: 1.5, step: 0.005, types: ['canyon'], description: 'Depth of the carved channel network as a fraction of elevation. At 0 the mesas have nothing between them.' },
262
- { key: 'valleyWidth', animatable: false, label: 'Incision width', group: 'form', min: 0.03, max: 1, step: 0.005, types: ['canyon'], description: 'Narrow cuts slot canyons; wide ones cut broad washes.' },
263
- { key: 'bearing', animatable: false, label: 'Wind bearing', group: 'form', min: 0, max: 360, step: 1, unit: 'deg', types: ['dunes'], description: 'Dunes are transverse to the wind, so this rotates the whole crest train.' },
264
- { key: 'duneWavelength', animatable: false, label: 'Dune wavelength', group: 'form', min: 40, max: 2000, step: 5, unit: 'm', types: ['dunes'], description: 'Crest-to-crest distance of the dune train.' },
265
- { key: 'duneAsymmetry', animatable: false, label: 'Slip face', group: 'form', min: 0, max: 1, step: 0.005, types: ['dunes'], description: 'Lee-slope steepening. At 0 the dunes are sine waves; real ones have a long windward ramp and a short face at the angle of repose.' },
266
- { key: 'slopeRockStart', animatable: false, label: 'Rock from slope', group: 'surface', min: 0, max: 1, step: 0.005, description: 'Slope at which rock starts showing through. Splatting rock by slope rather than height is what makes a cliff read as a cliff at any altitude.' },
267
- { key: 'slopeRockEnd', animatable: false, label: 'Bare rock at slope', group: 'surface', min: 0, max: 1, step: 0.005, description: 'Slope at which the surface is fully bare rock.' },
268
- { key: 'peakLevel', animatable: false, label: 'Peak line', group: 'surface', min: 0, max: 1, step: 0.005, description: 'Height fraction where the peak layer (snow, salt, bleached stone) begins.' },
269
- { key: 'peakBlend', animatable: false, label: 'Peak blend', group: 'surface', min: 0.01, max: 0.5, step: 0.005, description: 'Width of that transition. A hard line is physically right for temperature but reads as a decal.' },
270
- { key: 'peakSlopeFalloff', animatable: false, label: 'Peak slope falloff', group: 'surface', min: 0, max: 3, step: 0.01, description: 'Peak coverage lost per unit slope. Snow does not sit on a vertical face; without this a summit looks dipped in paint.' },
271
- { key: 'macroVariation', animatable: false, label: 'Macro variation', group: 'surface', min: 0, max: 1, step: 0.005, description: 'Large-scale albedo break-up. Without it a splat layer is one flat colour across kilometres and reads as untextured.' },
272
- { key: 'macroSize', animatable: false, label: 'Macro size', group: 'surface', min: 200, max: 12000, step: 50, unit: 'm', description: 'Size of that variation.' },
273
- { key: 'detailStrength', animatable: false, label: 'Detail bump', group: 'surface', min: 0, max: 1.5, step: 0.005, description: 'High-frequency normal detail added per fragment — bumps far below the mesh resolution.' },
274
- { key: 'detailSize', animatable: false, label: 'Detail size', group: 'surface', min: 0.5, max: 60, step: 0.25, unit: 'm', description: 'Size of that detail. Below about a metre it aliases before it fades.' },
259
+ { key: 'terraceSharpness', label: 'Strata hardness', group: 'form', min: 0, max: 1, step: 0.01, types: ['canyon', 'mountains'], description: '0 is a smooth ramp between bands, 1 a near-vertical riser.' },
260
+ { key: 'plateau', label: 'Plateau', group: 'form', min: 0, max: 1, step: 0.005, types: ['canyon'], description: 'Fraction of the height range flattened into mesa tops.' },
261
+ { key: 'valleyDepth', label: 'Incision depth', group: 'form', min: 0, max: 1.5, step: 0.005, types: ['canyon'], description: 'Depth of the carved channel network as a fraction of elevation. At 0 the mesas have nothing between them.' },
262
+ { key: 'valleyWidth', label: 'Incision width', group: 'form', min: 0.03, max: 1, step: 0.005, types: ['canyon'], description: 'Narrow cuts slot canyons; wide ones cut broad washes.' },
263
+ { key: 'bearing', label: 'Wind bearing', group: 'form', min: 0, max: 360, step: 1, unit: 'deg', types: ['dunes'], description: 'Dunes are transverse to the wind, so this rotates the whole crest train.' },
264
+ { key: 'duneWavelength', label: 'Dune wavelength', group: 'form', min: 40, max: 2000, step: 5, unit: 'm', types: ['dunes'], description: 'Crest-to-crest distance of the dune train.' },
265
+ { key: 'duneAsymmetry', label: 'Slip face', group: 'form', min: 0, max: 1, step: 0.005, types: ['dunes'], description: 'Lee-slope steepening. At 0 the dunes are sine waves; real ones have a long windward ramp and a short face at the angle of repose.' },
266
+ { key: 'slopeRockStart', label: 'Rock from slope', group: 'surface', min: 0, max: 1, step: 0.005, description: 'Slope at which rock starts showing through. Splatting rock by slope rather than height is what makes a cliff read as a cliff at any altitude.' },
267
+ { key: 'slopeRockEnd', label: 'Bare rock at slope', group: 'surface', min: 0, max: 1, step: 0.005, description: 'Slope at which the surface is fully bare rock.' },
268
+ { key: 'peakLevel', label: 'Peak line', group: 'surface', min: 0, max: 1, step: 0.005, description: 'Height fraction where the peak layer (snow, salt, bleached stone) begins.' },
269
+ { key: 'peakBlend', label: 'Peak blend', group: 'surface', min: 0.01, max: 0.5, step: 0.005, description: 'Width of that transition. A hard line is physically right for temperature but reads as a decal.' },
270
+ { key: 'peakSlopeFalloff', label: 'Peak slope falloff', group: 'surface', min: 0, max: 3, step: 0.01, description: 'Peak coverage lost per unit slope. Snow does not sit on a vertical face; without this a summit looks dipped in paint.' },
271
+ { key: 'macroVariation', label: 'Macro variation', group: 'surface', min: 0, max: 1, step: 0.005, description: 'Large-scale albedo break-up. Without it a splat layer is one flat colour across kilometres and reads as untextured.' },
272
+ { key: 'macroSize', label: 'Macro size', group: 'surface', min: 200, max: 12000, step: 50, unit: 'm', description: 'Size of that variation.' },
273
+ { key: 'detailStrength', label: 'Detail bump', group: 'surface', min: 0, max: 1.5, step: 0.005, description: 'High-frequency normal detail added per fragment — bumps far below the mesh resolution.' },
274
+ { key: 'detailSize', label: 'Detail size', group: 'surface', min: 0.5, max: 60, step: 0.25, unit: 'm', description: 'Size of that detail. Below about a metre it aliases before it fades.' },
275
275
  { key: 'roughness', label: 'Roughness', group: 'surface', min: 0.05, max: 1, step: 0.005, description: 'Widens the specular lobe. Rock is nearly matte; wet sand and snow are not.' },
276
276
  { key: 'specular', label: 'Specular', group: 'surface', min: 0, max: 1, step: 0.005, description: 'Specular strength. The grazing sheen on sand at low sun comes from here.' },
277
- { key: 'textureDistance', animatable: false, label: 'Texture distance', group: 'surface', min: 100, max: 12000, step: 50, unit: 'm', description: 'How far out the ground is drawn with real textures. Past it every layer fades to its flat far colour, so the horizon costs nothing extra.' },
278
- { key: 'textureHeightBlend', animatable: false, label: 'Texture height blend', group: 'surface', min: 0, max: 1, step: 0.01, description: '0 cross-fades the layers; 1 lets the layer whose own surface is higher win, so rock pushes up through grass along its cracks.' },
277
+ { key: 'textureDistance', label: 'Texture distance', group: 'surface', min: 100, max: 12000, step: 50, unit: 'm', description: 'How far out the ground is drawn with real textures. Past it every layer fades to its flat far colour, so the horizon costs nothing extra.' },
278
+ { key: 'textureHeightBlend', label: 'Texture height blend', group: 'surface', min: 0, max: 1, step: 0.01, description: '0 cross-fades the layers; 1 lets the layer whose own surface is higher win, so rock pushes up through grass along its cracks.' },
279
279
  { key: 'ambient', label: 'Ambient', group: 'lighting', min: 0, max: 3, step: 0.01, description: 'Sky-dome fill, taken from the same atmosphere the sky and clouds use, so it darkens and warms as the sun sets instead of freezing.' },
280
280
  { key: 'bounce', label: 'Ground bounce', group: 'lighting', min: 0, max: 2, step: 0.01, description: 'Fill on downward-facing surfaces, tinted by the low colour. Keeps overhangs and north faces off pure black.' },
281
281
  { key: 'sunShadow', label: 'Self shadow', group: 'lighting', min: 0, max: 1, step: 0.01, description: 'Strength of the analytic shadow marched down the sun vector. This is what puts a mountain shadow in its own valley, with no shadow-map resolution to run out of.' },
282
- { key: 'shadowSoftness', animatable: false, label: 'Shadow softness', group: 'lighting', min: 1, max: 60, step: 0.5, description: 'Penumbra width of that shadow. Larger reads as a hazier day.' },
282
+ { key: 'shadowSoftness', label: 'Shadow softness', group: 'lighting', min: 1, max: 60, step: 0.5, description: 'Penumbra width of that shadow. Larger reads as a hazier day.' },
283
283
  { key: 'aerialPerspective', label: 'Aerial perspective', group: 'lighting', min: 0, max: 0.0004, step: 0.000002, unit: '1/m', description: 'Rate distant terrain fades into the sky behind it. The main cue for how large the landscape reads, and what makes the horizon a horizon rather than a cut-out.' },
284
284
  ];
285
285
  export const TERRAIN_QUALITY_SCHEMA = [
@@ -7,11 +7,7 @@ export declare const RAIN_ANIMATABLE_KEYS: readonly ["color", "size", "opacity",
7
7
  * renderer, so they have no material properties. They animate through config.
8
8
  */
9
9
  export declare const SELF_MANAGED_MATERIAL_TYPES: Set<string>;
10
- /**
11
- * True when the object draws with its own shaders: a whole object type from the set above, or a text look.
12
- * Object type 'text' also hosts the legacy bitmap / 3D text, which keeps its material, so text is decided per
13
- * object (config.type), not by type. Use this, never the set alone, wherever the material panel is decided.
14
- */
10
+ /** True when the object draws with its own shaders (the object types above): it gets no material specs. */
15
11
  export declare const selfManagesMaterial: (obj: {
16
12
  type?: string;
17
13
  config?: unknown;
@@ -45,6 +41,15 @@ export declare function getAnimatableSpecs(element: PropertyElement, settings: a
45
41
  export declare const TRACK_CONFIG_DOMAINS: ReadonlySet<PropertyDomain>;
46
42
  /** What an animation clip can key on this element (timeline track picker, AI clips). */
47
43
  export declare function getTrackSpecs(element: PropertyElement, settings: any): PropertySpec[];
44
+ /**
45
+ * Structural properties a clip can key as DISCRETE tracks (timeline): not writable per
46
+ * frame, so the clip sets them at its keys — the runtime lays the values at the playhead
47
+ * over the element's settings through the SceneActions patch layer, like an action, and
48
+ * the element re-renders. Every domain qualifies (it goes through the settings path, not
49
+ * a live handle); textures don't (no key editor for them). Not filtered by
50
+ * isPropertyLive: the switch that turns a layer on is itself one of these.
51
+ */
52
+ export declare function getDiscreteTrackSpecs(element: PropertyElement, settings: any): PropertySpec[];
48
53
  export declare function getPropertySpec(element: PropertyElement, settings: any, key: string): PropertySpec | undefined;
49
54
  /** Specs with the element's current values. */
50
55
  export declare function describeProperties(element: PropertyElement, settings: any): DescribedProperty[];
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/properties/registry.ts"],"names":[],"mappings":"AAsDA,OAAO,EACH,KAAK,gBAAgB,EAMxB,MAAM,6BAA6B,CAAC;AAWrC,OAAO,KAAK,EACR,iBAAiB,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAkB,YAAY,EACjG,MAAM,SAAS,CAAC;AAMjB,0CAA0C;AAC1C,eAAO,MAAM,oBAAoB,+FAAgG,CAAC;AAUlI;;;GAGG;AACH,eAAO,MAAM,2BAA2B,aAAoF,CAAC;AAE7H;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAAI,KAAK;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,KAAG,OAC2B,CAAC;AAmB9H,4DAA4D;AAC5D,eAAO,MAAM,aAAa,GAAI,KAAK,MAAM,KAAG,MACiC,CAAC;AAE9E,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAOpE;AAID,kGAAkG;AAClG,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,GAAG,YAAY,GAAG,IAAI,CAaxE;AAgCD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,gBAAgB,EAAE,EAAE,MAAM,SAAK,EAAE,MAAM,GAAE,cAAyB,GAAG,YAAY,EAAE,CAExH;AAwND,+EAA+E;AAC/E,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,GAAG,GAAG,YAAY,EAAE,CAIxF;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,GAAG,OAAO,CAKnG;AAED,yEAAyE;AACzE,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,GAAG,GAAG,YAAY,EAAE,CAE1F;AAED;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,EAAE,WAAW,CAAC,cAAc,CAA6G,CAAC;AAE3K,wFAAwF;AACxF,wBAAgB,aAAa,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,GAAG,GAAG,YAAY,EAAE,CAIrF;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAE9G;AAED,+CAA+C;AAC/C,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,GAAG,GAAG,iBAAiB,EAAE,CAE/F;AAED,wHAAwH;AACxH,eAAO,MAAM,cAAc,GAAI,OAAO,MAAM,KAAG,eAC+E,CAAC"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/properties/registry.ts"],"names":[],"mappings":"AAuDA,OAAO,EACH,KAAK,gBAAgB,EAMxB,MAAM,6BAA6B,CAAC;AAWrC,OAAO,KAAK,EACR,iBAAiB,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAkB,YAAY,EACjG,MAAM,SAAS,CAAC;AAMjB,0CAA0C;AAC1C,eAAO,MAAM,oBAAoB,+FAAgG,CAAC;AAWlI;;;GAGG;AACH,eAAO,MAAM,2BAA2B,aAA4F,CAAC;AAErI,2GAA2G;AAC3G,eAAO,MAAM,mBAAmB,GAAI,KAAK;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,KAAG,OAClC,CAAC;AAmBjE,4DAA4D;AAC5D,eAAO,MAAM,aAAa,GAAI,KAAK,MAAM,KAAG,MACiC,CAAC;AAE9E,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAOpE;AAID,kGAAkG;AAClG,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,GAAG,YAAY,GAAG,IAAI,CAaxE;AAgCD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,gBAAgB,EAAE,EAAE,MAAM,SAAK,EAAE,MAAM,GAAE,cAAyB,GAAG,YAAY,EAAE,CAExH;AAkOD,+EAA+E;AAC/E,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,GAAG,GAAG,YAAY,EAAE,CAIxF;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,GAAG,OAAO,CAUnG;AAED,yEAAyE;AACzE,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,GAAG,GAAG,YAAY,EAAE,CAE1F;AAED;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,EAAE,WAAW,CAAC,cAAc,CAA6G,CAAC;AAE3K,wFAAwF;AACxF,wBAAgB,aAAa,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,GAAG,GAAG,YAAY,EAAE,CAIrF;AAgBD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,GAAG,GAAG,YAAY,EAAE,CAG7F;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAE9G;AAED,+CAA+C;AAC/C,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,GAAG,GAAG,iBAAiB,EAAE,CAE/F;AAED,wHAAwH;AACxH,eAAO,MAAM,cAAc,GAAI,OAAO,MAAM,KAAG,eAC+E,CAAC"}