@3driseai/3drise-core 1.0.21 → 1.0.22

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 (159) hide show
  1. package/dist/autoAnimate/composer.d.ts +6 -0
  2. package/dist/autoAnimate/composer.d.ts.map +1 -1
  3. package/dist/autoAnimate/composer.js +4 -3
  4. package/dist/autoAnimate/describeScene.js +1 -1
  5. package/dist/catalog/catalogInfo.d.ts +22 -0
  6. package/dist/catalog/catalogInfo.d.ts.map +1 -0
  7. package/dist/catalog/catalogInfo.js +204 -0
  8. package/dist/catalog/index.d.ts +3 -0
  9. package/dist/catalog/index.d.ts.map +1 -0
  10. package/dist/catalog/index.js +2 -0
  11. package/dist/catalog/objectCatalog.d.ts +33 -0
  12. package/dist/catalog/objectCatalog.d.ts.map +1 -0
  13. package/dist/catalog/objectCatalog.js +99 -0
  14. package/dist/data/allMaterials.js +2 -2
  15. package/dist/data/environmentDefaults.d.ts +10 -0
  16. package/dist/data/environmentDefaults.d.ts.map +1 -0
  17. package/dist/data/environmentDefaults.js +126 -0
  18. package/dist/data/gridsDefaults.d.ts +2 -0
  19. package/dist/data/gridsDefaults.d.ts.map +1 -1
  20. package/dist/data/gridsDefaults.js +57 -0
  21. package/dist/data/index.d.ts +4 -0
  22. package/dist/data/index.d.ts.map +1 -1
  23. package/dist/data/index.js +4 -0
  24. package/dist/data/landDefaults.d.ts +26 -0
  25. package/dist/data/landDefaults.d.ts.map +1 -0
  26. package/dist/data/landDefaults.js +76 -0
  27. package/dist/data/spaceDefaults.d.ts +10 -0
  28. package/dist/data/spaceDefaults.d.ts.map +1 -0
  29. package/dist/data/spaceDefaults.js +46 -0
  30. package/dist/data/textDefaults.d.ts +16 -0
  31. package/dist/data/textDefaults.d.ts.map +1 -0
  32. package/dist/data/textDefaults.js +199 -0
  33. package/dist/environment/oceanConfigs.d.ts +5 -4
  34. package/dist/environment/oceanConfigs.d.ts.map +1 -1
  35. package/dist/environment/oceanConfigs.js +2 -2
  36. package/dist/environment/terrainConfigs.d.ts +78 -0
  37. package/dist/environment/terrainConfigs.d.ts.map +1 -1
  38. package/dist/environment/terrainConfigs.js +72 -2
  39. package/dist/index.d.ts +3 -1
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +3 -1
  42. package/dist/properties/registry.d.ts +10 -1
  43. package/dist/properties/registry.d.ts.map +1 -1
  44. package/dist/properties/registry.js +60 -9
  45. package/dist/properties/tables/environmentProperties.d.ts +9 -0
  46. package/dist/properties/tables/environmentProperties.d.ts.map +1 -0
  47. package/dist/properties/tables/environmentProperties.js +127 -0
  48. package/dist/properties/tables/gridProperties.d.ts.map +1 -1
  49. package/dist/properties/tables/gridProperties.js +117 -93
  50. package/dist/properties/tables/index.d.ts +4 -0
  51. package/dist/properties/tables/index.d.ts.map +1 -1
  52. package/dist/properties/tables/index.js +4 -0
  53. package/dist/properties/tables/landProperties.d.ts +5 -0
  54. package/dist/properties/tables/landProperties.d.ts.map +1 -0
  55. package/dist/properties/tables/landProperties.js +24 -0
  56. package/dist/properties/tables/optionalProperties.d.ts +1 -2
  57. package/dist/properties/tables/optionalProperties.d.ts.map +1 -1
  58. package/dist/properties/tables/optionalProperties.js +21 -0
  59. package/dist/properties/tables/spaceProperties.d.ts +8 -0
  60. package/dist/properties/tables/spaceProperties.d.ts.map +1 -0
  61. package/dist/properties/tables/spaceProperties.js +42 -0
  62. package/dist/properties/tables/textProperties.d.ts +4 -0
  63. package/dist/properties/tables/textProperties.d.ts.map +1 -0
  64. package/dist/properties/tables/textProperties.js +361 -0
  65. package/dist/properties/types.d.ts +1 -1
  66. package/dist/properties/types.d.ts.map +1 -1
  67. package/dist/services/MaterialRegistry.d.ts.map +1 -1
  68. package/dist/services/MaterialRegistry.js +2 -0
  69. package/dist/services/SkySystemManager.d.ts +22 -0
  70. package/dist/services/SkySystemManager.d.ts.map +1 -1
  71. package/dist/services/SkySystemManager.js +50 -18
  72. package/dist/services/TextureResolver.d.ts.map +1 -1
  73. package/dist/services/TextureResolver.js +22 -0
  74. package/dist/services/index.d.ts +1 -1
  75. package/dist/services/index.d.ts.map +1 -1
  76. package/dist/services/index.js +1 -1
  77. package/dist/shaders/SkyboxMaterial.js +3 -3
  78. package/dist/shaders/StarsMaterial.d.ts +5 -0
  79. package/dist/shaders/StarsMaterial.d.ts.map +1 -1
  80. package/dist/shaders/StarsMaterial.js +59 -57
  81. package/dist/types/actions.d.ts +6 -5
  82. package/dist/types/actions.d.ts.map +1 -1
  83. package/dist/types/commands.d.ts +61 -0
  84. package/dist/types/commands.d.ts.map +1 -0
  85. package/dist/types/commands.js +1 -0
  86. package/dist/types/environment.d.ts +34 -1
  87. package/dist/types/environment.d.ts.map +1 -1
  88. package/dist/types/environment.js +15 -0
  89. package/dist/types/environmentObjects.d.ts +152 -0
  90. package/dist/types/environmentObjects.d.ts.map +1 -0
  91. package/dist/types/environmentObjects.js +10 -0
  92. package/dist/types/index.d.ts +5 -1
  93. package/dist/types/index.d.ts.map +1 -1
  94. package/dist/types/landObjects.d.ts +15 -0
  95. package/dist/types/landObjects.d.ts.map +1 -0
  96. package/dist/types/landObjects.js +1 -0
  97. package/dist/types/objectSettings.d.ts +187 -16
  98. package/dist/types/objectSettings.d.ts.map +1 -1
  99. package/dist/types/objectsConfigs.d.ts +0 -3
  100. package/dist/types/objectsConfigs.d.ts.map +1 -1
  101. package/dist/types/scene3d.d.ts +8 -5
  102. package/dist/types/scene3d.d.ts.map +1 -1
  103. package/dist/types/spaceObjects.d.ts +65 -0
  104. package/dist/types/spaceObjects.d.ts.map +1 -0
  105. package/dist/types/spaceObjects.js +11 -0
  106. package/dist/types/textObjects.d.ts +352 -0
  107. package/dist/types/textObjects.d.ts.map +1 -0
  108. package/dist/types/textObjects.js +14 -0
  109. package/dist/types/types.d.ts +3 -6
  110. package/dist/types/types.d.ts.map +1 -1
  111. package/dist/types/users.d.ts +3 -1
  112. package/dist/types/users.d.ts.map +1 -1
  113. package/dist/types/users.js +2 -0
  114. package/dist/ui/index.d.ts +5 -0
  115. package/dist/ui/index.d.ts.map +1 -0
  116. package/dist/ui/index.js +4 -0
  117. package/dist/ui/uiBindings.d.ts +45 -0
  118. package/dist/ui/uiBindings.d.ts.map +1 -0
  119. package/dist/ui/uiBindings.js +172 -0
  120. package/dist/ui/uiKeys.d.ts +14 -0
  121. package/dist/ui/uiKeys.d.ts.map +1 -0
  122. package/dist/ui/uiKeys.js +22 -0
  123. package/dist/ui/uiSanitize.d.ts +18 -0
  124. package/dist/ui/uiSanitize.d.ts.map +1 -0
  125. package/dist/ui/uiSanitize.js +251 -0
  126. package/dist/ui/uiSpec.d.ts +116 -0
  127. package/dist/ui/uiSpec.d.ts.map +1 -0
  128. package/dist/ui/uiSpec.js +173 -0
  129. package/dist/utils/environmentMigration.d.ts +3 -0
  130. package/dist/utils/environmentMigration.d.ts.map +1 -0
  131. package/dist/utils/environmentMigration.js +50 -0
  132. package/dist/utils/generativeAnimatable.d.ts +1 -1
  133. package/dist/utils/generativeAnimatable.d.ts.map +1 -1
  134. package/dist/utils/generativeAnimatable.js +12 -0
  135. package/dist/utils/getAnimatableProperties.d.ts +1 -1
  136. package/dist/utils/getAnimatableProperties.d.ts.map +1 -1
  137. package/dist/utils/getAnimatableProperties.js +1 -1
  138. package/dist/utils/gridMigration.d.ts +3 -0
  139. package/dist/utils/gridMigration.d.ts.map +1 -0
  140. package/dist/utils/gridMigration.js +34 -0
  141. package/dist/utils/index.d.ts +5 -0
  142. package/dist/utils/index.d.ts.map +1 -1
  143. package/dist/utils/index.js +5 -0
  144. package/dist/utils/objectEffects.d.ts +24 -2
  145. package/dist/utils/objectEffects.d.ts.map +1 -1
  146. package/dist/utils/objectEffects.js +29 -2
  147. package/dist/utils/objectMigration.d.ts +9 -0
  148. package/dist/utils/objectMigration.d.ts.map +1 -0
  149. package/dist/utils/objectMigration.js +12 -0
  150. package/dist/utils/skyPhase.d.ts +61 -0
  151. package/dist/utils/skyPhase.d.ts.map +1 -0
  152. package/dist/utils/skyPhase.js +93 -0
  153. package/dist/utils/spaceMigration.d.ts +3 -0
  154. package/dist/utils/spaceMigration.d.ts.map +1 -0
  155. package/dist/utils/spaceMigration.js +46 -0
  156. package/dist/utils/sunUtils.d.ts +26 -1
  157. package/dist/utils/sunUtils.d.ts.map +1 -1
  158. package/dist/utils/sunUtils.js +37 -6
  159. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/properties/registry.ts"],"names":[],"mappings":"AA8CA,OAAO,EACH,KAAK,gBAAgB,EAMxB,MAAM,6BAA6B,CAAC;AAOrC,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,aAAoD,CAAC;AAmB7F,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;AAuLD,+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,CAInG;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,CAAqE,CAAC;AAEnI,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":"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"}
@@ -2,13 +2,21 @@ import { LIGHTS_ANIMATABLE } from '../data/lightsDefaults.js';
2
2
  import { GENERATIVE_PARTICLES_ANIMATABLE } from '../data/particlesDefaults.js';
3
3
  import { EFFECTS_ANIMATABLE } from '../data/effectsDefaults.js';
4
4
  import { GRIDS_ANIMATABLE } from '../data/gridsDefaults.js';
5
+ import { ENVIRONMENT_OBJECTS_ANIMATABLE } from '../data/environmentDefaults.js';
6
+ import { LAND_OBJECTS_ANIMATABLE } from '../data/landDefaults.js';
7
+ import { SPACE_OBJECTS_ANIMATABLE } from '../data/spaceDefaults.js';
8
+ import { TEXT_OBJECTS_ANIMATABLE, isTextObjectConfig } from '../data/textDefaults.js';
5
9
  import { CLOUD_ANIMATABLE_PROPERTIES } from '../environment/cloudConfigs.js';
6
- import { skyOptionalProperties, cloudDeckOptionalProperties, cirrusOptionalProperties, oceanSurfaceOptionalProperties, terrainOptionalProperties, rainOptionalProperties, cloudsOptionalProperties, textOptionalProperties, plainOptionalProperties, pathOptionalProperties, edgesOptionalProperties, } from './tables/optionalProperties.js';
10
+ import { skyOptionalProperties, skyStarsOptionalProperties, cloudDeckOptionalProperties, cirrusOptionalProperties, oceanSurfaceOptionalProperties, terrainOptionalProperties, rainOptionalProperties, cloudsOptionalProperties, textOptionalProperties, plainOptionalProperties, pathOptionalProperties, edgesOptionalProperties, } from './tables/optionalProperties.js';
7
11
  import { SHAPE_CONTROLS, MODE_CONTROLS } from './tables/geometryProperties.js';
8
12
  import { LIGHT_PROPERTIES, SHADOW_PROPERTIES } from './tables/lightProperties.js';
9
13
  import { PARTICLES_PROPERTIES } from './tables/particlesProperties.js';
10
14
  import { EFFECT_PROPERTIES } from './tables/effectsProperties.js';
11
15
  import { GRID_PROPERTIES } from './tables/gridProperties.js';
16
+ import { ENVIRONMENT_PROPERTIES } from './tables/environmentProperties.js';
17
+ import { LAND_PROPERTIES } from './tables/landProperties.js';
18
+ import { SPACE_PROPERTIES } from './tables/spaceProperties.js';
19
+ import { TEXT_PROPERTIES } from './tables/textProperties.js';
12
20
  import { MATERIAL_PROPERTY_BOUNDS } from './tables/materialBounds.js';
13
21
  // =============================================================================
14
22
  // Data owned here (was inline in getAnimatableProperties / the timeline)
@@ -26,7 +34,13 @@ const MATERIAL_STRUCTURAL = new Set([
26
34
  * Objects that own their shader: their materialSettings (if any) never reach the
27
35
  * renderer, so they have no material properties. They animate through config.
28
36
  */
29
- export const SELF_MANAGED_MATERIAL_TYPES = new Set(['effect', 'grid', 'light', 'particles']);
37
+ export const SELF_MANAGED_MATERIAL_TYPES = new Set(['effect', 'grid', 'light', 'particles', 'environment', 'space', 'land']);
38
+ /**
39
+ * True when the object draws with its own shaders: a whole object type from the set above, or a text look.
40
+ * Object type 'text' also hosts the legacy bitmap / 3D text, which keeps its material, so text is decided per
41
+ * object (config.type), not by type. Use this, never the set alone, wherever the material panel is decided.
42
+ */
43
+ export const selfManagesMaterial = (obj) => !!obj && (SELF_MANAGED_MATERIAL_TYPES.has(obj.type) || (obj.type === 'text' && isTextObjectConfig(obj.config)));
30
44
  const CAMERA_SPECS = [
31
45
  { key: 'position', name: 'position', label: 'Position', kind: 'vec3', domain: 'camera', animatable: true },
32
46
  { key: 'controls.target', name: 'target', label: 'Target', kind: 'vec3', domain: 'camera', animatable: true },
@@ -188,6 +202,13 @@ function controlSpecs(controls, prefix, group) {
188
202
  return spec;
189
203
  });
190
204
  }
205
+ /** Environment families animate by the environment rule (numbers and colours unless the schema opts out). */
206
+ const envFamily = (domain, list, prefix) => ({
207
+ domain,
208
+ list,
209
+ prefix,
210
+ animatable: new Map(list.filter(envAnimatable).map(p => [p.name, p.label ?? propertyLabel(p.name)])),
211
+ });
191
212
  const tableOf = (rows) => new Map((rows ?? []).map(r => [r.value, r.label]));
192
213
  /** The config family of an object: by object type, else by config.type (as getAnimatableProperties does). */
193
214
  function familyOf(obj) {
@@ -197,6 +218,19 @@ function familyOf(obj) {
197
218
  const particles = () => ({ domain: 'particles', list: PARTICLES_PROPERTIES[t] ?? [], animatable: tableOf(GENERATIVE_PARTICLES_ANIMATABLE[t]) });
198
219
  const effect = () => ({ domain: 'effect', list: EFFECT_PROPERTIES[t] ?? [], animatable: tableOf(EFFECTS_ANIMATABLE[t]) });
199
220
  const grid = () => ({ domain: 'grid', list: GRID_PROPERTIES[t] ?? [], animatable: tableOf(GRIDS_ANIMATABLE[t]) });
221
+ const environment = () => ({ domain: 'environment', list: ENVIRONMENT_PROPERTIES[t] ?? [], animatable: tableOf(ENVIRONMENT_OBJECTS_ANIMATABLE[t]) });
222
+ const space = () => ({ domain: 'space', list: SPACE_PROPERTIES[t] ?? [], animatable: tableOf(SPACE_OBJECTS_ANIMATABLE[t]) });
223
+ const land = () => ({ domain: 'land', list: LAND_PROPERTIES[t] ?? [], animatable: tableOf(LAND_OBJECTS_ANIMATABLE[t]) });
224
+ const text = () => ({ domain: 'text', list: TEXT_PROPERTIES[t] ?? [], animatable: tableOf(TEXT_OBJECTS_ANIMATABLE[t]) });
225
+ // Environment elements seen through the object view, so the Animation and
226
+ // MouseMove panels (getAnimatableProperties) work on them like on any object.
227
+ // The sky is flat — no config block — so it is keyed before the config.type gate.
228
+ if (type === 'sky')
229
+ return envFamily('sky', skyOptionalProperties, '');
230
+ if (type === 'ocean' && obj?.config)
231
+ return envFamily('ocean', oceanSurfaceOptionalProperties(obj.config.waterType, obj.config.host), 'config.');
232
+ if (type === 'terrain' && obj?.config)
233
+ return envFamily('terrain', terrainOptionalProperties(obj.config.terrainType), 'config.');
200
234
  if (t) {
201
235
  if (type === 'light')
202
236
  return light();
@@ -206,6 +240,18 @@ function familyOf(obj) {
206
240
  return effect();
207
241
  if (type === 'grid')
208
242
  return grid();
243
+ // Before the rain branch: the rain *object* is a family member; the branch below is the scene-level rain element.
244
+ if (type === 'environment' && ENVIRONMENT_OBJECTS_ANIMATABLE[t])
245
+ return environment();
246
+ // Space objects only under their own object type: their keys ('stars', 'earth'…) are too generic to match by config.type alone.
247
+ if (type === 'space' && SPACE_OBJECTS_ANIMATABLE[t])
248
+ return space();
249
+ // Land objects only under their own object type: their keys are landform names ('hills'…).
250
+ if (type === 'land' && LAND_OBJECTS_ANIMATABLE[t])
251
+ return land();
252
+ // Text looks only under the text object type, and only with a config.type: the legacy 2d / 3d text (no config.type) falls through to its own list below.
253
+ if (type === 'text' && TEXT_OBJECTS_ANIMATABLE[t])
254
+ return text();
209
255
  if (t === 'rain')
210
256
  return { domain: 'rain', list: rainOptionalProperties, animatable: new Map(RAIN_ANIMATABLE_KEYS.map(k => [k, propertyLabel(k)])) };
211
257
  if (t === 'clouds')
@@ -239,11 +285,11 @@ function configSpecs(obj) {
239
285
  const family = familyOf(obj);
240
286
  if (!family)
241
287
  return [];
242
- const { domain, list, animatable } = family;
288
+ const { domain, list, animatable, prefix = 'config.' } = family;
243
289
  const out = [];
244
290
  const seen = new Set();
245
291
  for (const p of list) {
246
- const spec = fromOptional(p, 'config.', domain, !!animatable?.has(p.name));
292
+ const spec = fromOptional(p, prefix, domain, !!animatable?.has(p.name));
247
293
  out.push(spec);
248
294
  seen.add(p.name);
249
295
  }
@@ -252,7 +298,7 @@ function configSpecs(obj) {
252
298
  if (seen.has(name))
253
299
  continue;
254
300
  const kind = kindOfValue(name, obj?.config?.[name]) ?? 'number';
255
- out.push({ key: `config.${name}`, name, label: label || propertyLabel(name), kind, domain, animatable: true });
301
+ out.push({ key: `${prefix}${name}`, name, label: label || propertyLabel(name), kind, domain, animatable: true });
256
302
  }
257
303
  if (domain === 'light') {
258
304
  for (const p of SHADOW_PROPERTIES[obj.config.type] ?? []) {
@@ -264,7 +310,7 @@ function configSpecs(obj) {
264
310
  function objectSpecs(obj) {
265
311
  if (!obj)
266
312
  return [];
267
- const ownsMaterial = !SELF_MANAGED_MATERIAL_TYPES.has(obj.type);
313
+ const ownsMaterial = !selfManagesMaterial(obj);
268
314
  return [
269
315
  ...TRANSFORM_SPECS,
270
316
  ...(ownsMaterial ? materialSpecs(obj.materialSettings, 'materialSettings.', 'material') : []),
@@ -278,7 +324,10 @@ function objectSpecs(obj) {
278
324
  function environmentSpecs(element, settings) {
279
325
  switch (element) {
280
326
  case 'sky':
281
- return envSpecs(skyOptionalProperties, '', 'sky');
327
+ return [
328
+ ...envSpecs(skyOptionalProperties, '', 'sky'),
329
+ ...envSpecs(skyStarsOptionalProperties, 'stars.', 'stars'),
330
+ ];
282
331
  case 'clouds':
283
332
  return [
284
333
  ...envSpecs(cloudDeckOptionalProperties(settings?.config?.deckType), 'config.', 'clouds'),
@@ -312,6 +361,8 @@ export function isPropertyLive(element, spec, settings) {
312
361
  return settings?.edgesSettings?.enabled !== false;
313
362
  if (element === 'clouds')
314
363
  return spec.domain === 'cirrus' ? !!settings?.cirrus?.enabled : !!settings?.config?.enabled;
364
+ if (spec.domain === 'stars')
365
+ return settings?.stars?.visible !== false;
315
366
  return true;
316
367
  }
317
368
  /** Properties that can be driven per frame on this element right now. */
@@ -320,11 +371,11 @@ export function getAnimatableSpecs(element, settings) {
320
371
  }
321
372
  /**
322
373
  * Object config families the animation timeline keys. The V2 applier drives
323
- * `config.*` through the object's live config handle, which these four register;
374
+ * `config.*` through the object's live config handle, which these seven register;
324
375
  * rain and the legacy cloud object have per-frame knobs for the keyframe /
325
376
  * mouse-move systems only.
326
377
  */
327
- export const TRACK_CONFIG_DOMAINS = new Set(['light', 'particles', 'effect', 'grid']);
378
+ export const TRACK_CONFIG_DOMAINS = new Set(['light', 'particles', 'effect', 'grid', 'environment', 'space', 'land', 'text']);
328
379
  /** What an animation clip can key on this element (timeline track picker, AI clips). */
329
380
  export function getTrackSpecs(element, settings) {
330
381
  const specs = getAnimatableSpecs(element, settings);
@@ -0,0 +1,9 @@
1
+ import type { OptionalProperty } from './optionalProperties';
2
+ import type { EnvironmentObjectType } from '../../types/environmentObjects';
3
+ export declare const snowEnvironmentProperties: OptionalProperty[];
4
+ export declare const sandstormEnvironmentProperties: OptionalProperty[];
5
+ export declare const rainbowEnvironmentProperties: OptionalProperty[];
6
+ export declare const tornadoEnvironmentProperties: OptionalProperty[];
7
+ export declare const thunderstormEnvironmentProperties: OptionalProperty[];
8
+ export declare const ENVIRONMENT_PROPERTIES: Record<EnvironmentObjectType, OptionalProperty[]>;
9
+ //# sourceMappingURL=environmentProperties.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environmentProperties.d.ts","sourceRoot":"","sources":["../../../src/properties/tables/environmentProperties.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAO5E,eAAO,MAAM,yBAAyB,EAAE,gBAAgB,EAuBvD,CAAC;AAEF,eAAO,MAAM,8BAA8B,EAAE,gBAAgB,EAsB5D,CAAC;AAEF,eAAO,MAAM,4BAA4B,EAAE,gBAAgB,EAU1D,CAAC;AAEF,eAAO,MAAM,4BAA4B,EAAE,gBAAgB,EAyB1D,CAAC;AAEF,eAAO,MAAM,iCAAiC,EAAE,gBAAgB,EAqB/D,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,qBAAqB,EAAE,gBAAgB,EAAE,CAgBpF,CAAC"}
@@ -0,0 +1,127 @@
1
+ // =============================================================================
2
+ // ENVIRONMENT OBJECTS OPTIONAL PROPERTIES (generated: gen_family.mjs)
3
+ // Order: selects, base, variant, wind, colours, pointer (pointer* -> Pointer tab).
4
+ // =============================================================================
5
+ export const snowEnvironmentProperties = [
6
+ { name: 'quality', description: 'Detail level: scales the number of flakes (rebuilds)', type: 'select', options: ['low', 'medium', 'high'], optionLabels: ['Low', 'Medium', 'High'] },
7
+ { name: 'intensity', description: 'Overall brightness of the snow', type: 'number', min: 0, max: 2, step: 0.01 },
8
+ { name: 'speed', description: 'Time scale of the whole fall: flakes, gusts and eddies', type: 'number', min: 0, max: 3, step: 0.01 },
9
+ { name: 'opacity', description: 'Overall opacity', type: 'number', min: 0, max: 1, step: 0.01 },
10
+ { name: 'density', description: 'How heavily it snows (rebuilds)', type: 'number', min: 0.1, max: 3, step: 0.05 },
11
+ { name: 'flakeSize', description: 'Mean flake diameter; bigger flakes fall faster', type: 'number', min: 0.01, max: 0.12, step: 0.001, unit: 'm' },
12
+ { name: 'flutter', description: 'Side-to-side spiral of the falling flakes', type: 'number', min: 0, max: 1, step: 0.01 },
13
+ { name: 'tumble', description: 'How much the crystals rock and flip as they fall', type: 'number', min: 0, max: 1, step: 0.01 },
14
+ { name: 'glint', description: 'Sparkle of sunlight off the tumbling crystals', type: 'number', min: 0, max: 2, step: 0.01 },
15
+ { name: 'windStrength', description: 'Mean wind (1 = 8 m/s)', type: 'number', min: 0, max: 1, step: 0.01 },
16
+ { name: 'windDirection', description: 'Compass direction the wind blows toward', type: 'number', min: 0, max: 360, step: 1, unit: '°' },
17
+ { name: 'turbulence', description: 'Swirling eddies on top of the wind', type: 'number', min: 0, max: 1, step: 0.01 },
18
+ { name: 'gustiness', description: 'Strength of the gust waves that sweep downwind', type: 'number', min: 0, max: 1, step: 0.01 },
19
+ { name: 'bands', description: 'How strongly the gusts gather the snow into sweeping curtains', type: 'number', min: 0, max: 1, step: 0.01 },
20
+ { name: 'seed', description: 'Random layout of the flakes (rebuilds)', type: 'number', min: 1, max: 999, step: 1 },
21
+ { name: 'followCamera', description: 'Keep snowing around the camera wherever it goes, ignoring the sides of the volume', type: 'boolean' },
22
+ { name: 'color', description: 'Colour of the snow, lit by the sun and the sky', type: 'color' },
23
+ { name: 'shadeColor', description: 'Sky-lit shade on the side away from the sun', type: 'color' },
24
+ { name: 'pointerMode', description: 'What the cursor is: off, a gust of air, a shelter the snow slides off, or a warm hand that melts it', type: 'select', options: ['none', 'gust', 'shelter', 'warmth'], optionLabels: ['Off', 'Gust', 'Shelter', 'Warmth'] },
25
+ { name: 'pointerStrength', description: 'Force of the gust, width of the clearing, heat of the hand', type: 'number', min: 0, max: 3, step: 0.01 },
26
+ { name: 'pointerRadius', description: 'Reach of the cursor (1 = 2 m)', type: 'number', min: 0.2, max: 3, step: 0.01 },
27
+ { name: 'pointerColor', description: 'Warm glow of the melting droplets (Warmth)', type: 'color' },
28
+ ];
29
+ export const sandstormEnvironmentProperties = [
30
+ { name: 'quality', description: 'Detail level: scales the counts and the volume samples (rebuilds)', type: 'select', options: ['low', 'medium', 'high'], optionLabels: ['Low', 'Medium', 'High'] },
31
+ { name: 'intensity', description: 'Overall brightness', type: 'number', min: 0, max: 2, step: 0.01 },
32
+ { name: 'speed', description: 'Time scale of the storm: billows, gust fronts and grains', type: 'number', min: 0, max: 3, step: 0.01 },
33
+ { name: 'opacity', description: 'Overall opacity', type: 'number', min: 0, max: 1, step: 0.01 },
34
+ { name: 'density', description: 'How thick the dust is (rebuilds)', type: 'number', min: 0.1, max: 3, step: 0.05 },
35
+ { name: 'height', description: 'Scale height of the dust, as a share of the volume height', type: 'number', min: 0.05, max: 1, step: 0.01 },
36
+ { name: 'walls', description: 'Strength of the gust fronts: towering walls of dust rolling downwind', type: 'number', min: 0, max: 1, step: 0.01 },
37
+ { name: 'haze', description: 'Fine dust hanging everywhere between the walls', type: 'number', min: 0, max: 1, step: 0.01 },
38
+ { name: 'grains', description: 'Sand grains hopping along the ground', type: 'number', min: 0, max: 2, step: 0.01 },
39
+ { name: 'grainSize', description: 'Size and hop length of the grains', type: 'number', min: 0.3, max: 3, step: 0.01 },
40
+ { name: 'windStrength', description: 'Mean wind (1 = 8 m/s)', type: 'number', min: 0, max: 1, step: 0.01 },
41
+ { name: 'windDirection', description: 'Compass direction the wind blows toward', type: 'number', min: 0, max: 360, step: 1, unit: '°' },
42
+ { name: 'turbulence', description: 'How strongly the billows are warped and torn', type: 'number', min: 0, max: 1, step: 0.01 },
43
+ { name: 'seed', description: 'Random layout (rebuilds)', type: 'number', min: 1, max: 999, step: 1 },
44
+ { name: 'followCamera', description: 'Keep the weather around the camera wherever it goes, ignoring the sides of the volume', type: 'boolean' },
45
+ { name: 'color', description: 'Colour of the dust (its albedo: thick dust tints everything behind it)', type: 'color' },
46
+ { name: 'shadeColor', description: 'Sky-lit colour of the dust in shadow', type: 'color' },
47
+ { name: 'pointerMode', description: 'What the cursor is: off, a windbreak with still air behind it, a dust devil, or a gust', type: 'select', options: ['none', 'windbreak', 'devil', 'gust'], optionLabels: ['Off', 'Windbreak', 'Dust devil', 'Gust'] },
48
+ { name: 'pointerStrength', description: 'How still the lee, how strong the devil, how hard the gust', type: 'number', min: 0, max: 3, step: 0.01 },
49
+ { name: 'pointerRadius', description: 'Reach of the cursor (1 = 3 m)', type: 'number', min: 0.2, max: 3, step: 0.01 },
50
+ { name: 'pointerColor', description: 'Glow of the dust lifted by the dust devil', type: 'color' },
51
+ ];
52
+ export const rainbowEnvironmentProperties = [
53
+ { name: 'intensity', description: 'Brightness of the bow', type: 'number', min: 0, max: 2, step: 0.01 },
54
+ { name: 'opacity', description: 'Overall opacity', type: 'number', min: 0, max: 1, step: 0.01 },
55
+ { name: 'dropSize', description: 'Raindrop diameter: big drops give a narrow, vivid bow; small ones pale fringes inside it; fog drops a white fogbow', type: 'number', min: 0.03, max: 3, step: 0.01, unit: 'mm' },
56
+ { name: 'secondary', description: 'Strength of the secondary bow outside the primary (reversed colours, ~51°); 0 = a single rainbow', type: 'number', min: 0, max: 1, step: 0.01 },
57
+ { name: 'color', description: 'Tint of the bow (white = the pure spectrum)', type: 'color' },
58
+ { name: 'pointerMode', description: 'What the cursor is: off, a mist spray that brightens the bow, a clearing that wipes it, or a polarising filter that fades it as it turns', type: 'select', options: ['none', 'spray', 'clear', 'polarizer'], optionLabels: ['Off', 'Mist spray', 'Clearing', 'Polarising filter'] },
59
+ { name: 'pointerStrength', description: 'Brightness of the sprayed stretch, depth of the clearing, strength of the filter', type: 'number', min: 0, max: 3, step: 0.01 },
60
+ { name: 'pointerRadius', description: 'Reach of the spray or clearing (1 = 6 m)', type: 'number', min: 0.2, max: 3, step: 0.01 },
61
+ { name: 'pointerColor', description: 'Tint of the bow in the sprayed mist', type: 'color' },
62
+ ];
63
+ export const tornadoEnvironmentProperties = [
64
+ { name: 'quality', description: 'Detail level: scales the counts and the volume samples (rebuilds)', type: 'select', options: ['low', 'medium', 'high'], optionLabels: ['Low', 'Medium', 'High'] },
65
+ { name: 'intensity', description: 'Overall brightness', type: 'number', min: 0, max: 2, step: 0.01 },
66
+ { name: 'speed', description: 'Time scale of the whole vortex', type: 'number', min: 0, max: 3, step: 0.01 },
67
+ { name: 'opacity', description: 'Overall opacity', type: 'number', min: 0, max: 1, step: 0.01 },
68
+ { name: 'density', description: 'How opaque the funnel and dust are (rebuilds)', type: 'number', min: 0.1, max: 3, step: 0.05 },
69
+ { name: 'rotation', description: 'Spin rate of the vortex', type: 'number', min: 0, max: 3, step: 0.01 },
70
+ { name: 'coreRadius', description: 'Radius of the core, and so the width of the funnel', type: 'number', min: 0.3, max: 3, step: 0.01 },
71
+ { name: 'reach', description: 'How far down the condensation funnel reaches (1 = touchdown)', type: 'number', min: 0, max: 1, step: 0.01 },
72
+ { name: 'wander', description: 'How much the axis wanders and bends like a rope', type: 'number', min: 0, max: 1, step: 0.01 },
73
+ { name: 'lift', description: 'Updraft: how fast the streaks and dust climb', type: 'number', min: 0, max: 3, step: 0.01 },
74
+ { name: 'dust', description: 'Ground dust drawn in and swirled up around the funnel', type: 'number', min: 0, max: 2, step: 0.01 },
75
+ { name: 'dustSpread', description: 'How far out the dust swirls', type: 'number', min: 0.2, max: 3, step: 0.01 },
76
+ { name: 'windStrength', description: 'Mean wind (1 = 8 m/s)', type: 'number', min: 0, max: 1, step: 0.01 },
77
+ { name: 'windDirection', description: 'Compass direction the wind blows toward', type: 'number', min: 0, max: 360, step: 1, unit: '°' },
78
+ { name: 'turbulence', description: 'Raggedness of the flow', type: 'number', min: 0, max: 1, step: 0.01 },
79
+ { name: 'seed', description: 'Random layout (rebuilds)', type: 'number', min: 1, max: 999, step: 1 },
80
+ { name: 'followCamera', description: 'Keep the volume centred on the camera horizontally', type: 'boolean' },
81
+ { name: 'color', description: 'Colour of the condensation funnel', type: 'color' },
82
+ { name: 'shadeColor', description: 'Storm-light colour in shadow', type: 'color' },
83
+ { name: 'dustColor', description: 'Colour of the swirling dust', type: 'color' },
84
+ { name: 'pointerMode', description: 'What the cursor does: off, steers the foot of the tornado, feeds its inflow, or bends it with a gust', type: 'select', options: ['none', 'steer', 'feed', 'gust'], optionLabels: ['Off', 'Steer', 'Feed', 'Gust'] },
85
+ { name: 'pointerStrength', description: 'How far it steers, how much it feeds, how hard it bends', type: 'number', min: 0, max: 3, step: 0.01 },
86
+ { name: 'pointerRadius', description: 'Height span of the bend (Gust)', type: 'number', min: 0.2, max: 3, step: 0.01 },
87
+ { name: 'pointerColor', description: 'Colour of the dust the cursor feeds in', type: 'color' },
88
+ ];
89
+ export const thunderstormEnvironmentProperties = [
90
+ { name: 'quality', description: 'Detail level: scales the counts and the volume samples (rebuilds)', type: 'select', options: ['low', 'medium', 'high'], optionLabels: ['Low', 'Medium', 'High'] },
91
+ { name: 'intensity', description: 'Overall brightness', type: 'number', min: 0, max: 2, step: 0.01 },
92
+ { name: 'speed', description: 'Time scale of the drifting curtains and the flashes', type: 'number', min: 0, max: 3, step: 0.01 },
93
+ { name: 'opacity', description: 'Overall opacity', type: 'number', min: 0, max: 1, step: 0.01 },
94
+ { name: 'density', description: 'How thick the storm curtains are (rebuilds)', type: 'number', min: 0.1, max: 3, step: 0.05 },
95
+ { name: 'shafts', description: 'Visibility of the dark storm curtains', type: 'number', min: 0, max: 1, step: 0.01 },
96
+ { name: 'flashRate', description: 'Lightning flashes per minute (random intervals)', type: 'number', min: 0, max: 30, step: 0.1 },
97
+ { name: 'flashIntensity', description: 'Brightness of a flash, on the curtains and on the scene', type: 'number', min: 0, max: 3, step: 0.01 },
98
+ { name: 'windStrength', description: 'Mean wind (1 = 8 m/s)', type: 'number', min: 0, max: 1, step: 0.01 },
99
+ { name: 'windDirection', description: 'Compass direction the wind blows toward', type: 'number', min: 0, max: 360, step: 1, unit: '°' },
100
+ { name: 'turbulence', description: 'How ragged the curtains are', type: 'number', min: 0, max: 1, step: 0.01 },
101
+ { name: 'seed', description: 'Random layout (rebuilds)', type: 'number', min: 1, max: 999, step: 1 },
102
+ { name: 'followCamera', description: 'Keep the weather around the camera wherever it goes, ignoring the sides of the volume', type: 'boolean' },
103
+ { name: 'color', description: 'Colour of the curtains in the light', type: 'color' },
104
+ { name: 'shadeColor', description: 'Storm-dark tint of the curtains', type: 'color' },
105
+ { name: 'flashColor', description: 'Colour of the lightning', type: 'color' },
106
+ { name: 'pointerMode', description: 'What the cursor is: off, calls a strike where you sweep, or a clearing swept through the murk', type: 'select', options: ['none', 'strike', 'clear'], optionLabels: ['Off', 'Call a strike', 'Clearing'] },
107
+ { name: 'pointerStrength', description: 'How easily a sweep calls a strike, how deep the clearing', type: 'number', min: 0, max: 3, step: 0.01 },
108
+ { name: 'pointerRadius', description: 'Reach of the clearing (1 = 2 m)', type: 'number', min: 0.2, max: 3, step: 0.01 },
109
+ { name: 'pointerColor', description: 'Colour of the strikes the cursor calls', type: 'color' },
110
+ ];
111
+ export const ENVIRONMENT_PROPERTIES = {
112
+ snow: snowEnvironmentProperties,
113
+ sandstorm: sandstormEnvironmentProperties,
114
+ rainbow: rainbowEnvironmentProperties,
115
+ tornado: tornadoEnvironmentProperties,
116
+ thunderstorm: thunderstormEnvironmentProperties,
117
+ rain: [
118
+ { name: 'color', description: 'Colour of the drops', type: 'color' },
119
+ { name: 'size', description: 'Streak size', type: 'number', min: 0.01, max: 1, step: 0.01 },
120
+ { name: 'opacity', description: 'Opacity of the drops', type: 'number', min: 0, max: 1, step: 0.01 },
121
+ { name: 'speed', description: 'Fall speed', type: 'number', min: 0.1, max: 5, step: 0.1, unit: 'x' },
122
+ { name: 'density', description: 'How many drops fill the volume (rebuilds)', type: 'number', min: 1, max: 200, step: 1 },
123
+ { name: 'windStrength', description: 'How hard the wind pushes the drops sideways', type: 'number', min: 0, max: 1, step: 0.01 },
124
+ { name: 'windDirection', description: 'Compass direction the wind blows toward', type: 'number', min: 0, max: 360, step: 1, unit: '°' },
125
+ { name: 'turbulence', description: 'Random sway of the drops', type: 'number', min: 0, max: 1, step: 0.01 },
126
+ ],
127
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"gridProperties.d.ts","sourceRoot":"","sources":["../../../src/properties/tables/gridProperties.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAiB7D,4CAA4C;AAC5C,eAAO,MAAM,uBAAuB,EAAE,gBAAgB,EAwBrD,CAAC;AAiKF,sFAAsF;AACtF,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAE9D,CAAC"}
1
+ {"version":3,"file":"gridProperties.d.ts","sourceRoot":"","sources":["../../../src/properties/tables/gridProperties.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAiB7D,4CAA4C;AAC5C,eAAO,MAAM,uBAAuB,EAAE,gBAAgB,EAsBrD,CAAC;AA8LF,sFAAsF;AACtF,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAE9D,CAAC"}
@@ -32,100 +32,127 @@ export const GRID_SURFACE_PROPERTIES = [
32
32
  { name: 'glowColor', description: 'Glow colour of the animated highlights', type: 'color' },
33
33
  { name: 'bgColor', description: 'Background colour', type: 'color' },
34
34
  { name: 'bgOpacity', description: 'Background opacity; 0 leaves only the lines', type: 'number', min: 0, max: 1, step: 0.01 },
35
- { name: 'flat', description: 'Lie flat (on) or stand upright (off)', type: 'boolean' },
36
- { name: 'followMouse', description: 'Ripples and focus follow the pointer', type: 'boolean' },
37
35
  { name: 'reveal', description: 'How much of the grid is built (0 gone, 1 complete)', type: 'number', min: 0, max: 1, step: 0.01 },
38
36
  { name: 'revealDuration', description: 'Seconds to build or dissolve; 0 applies instantly', type: 'number', min: 0, max: 10, step: 0.1 },
39
37
  ];
40
- const own = {
41
- advancedGrid: [],
42
- quasiGrid: [
43
- { name: 'symmetry', description: 'Line families, 3..9. 5 is Penrose; 4 and 6 come out periodic', type: 'number', min: 3, max: 9, step: 1 },
44
- { name: 'phase', description: 'Slides the pattern through itself', type: 'number', min: 0, max: 1, step: 0.01 },
45
- ],
46
- hexGrid: [
47
- { name: 'plateau', description: 'With displacement, each hex lifts as a flat plate', type: 'boolean' },
48
- ],
49
- circuitGrid: [
50
- { name: 'powered', description: 'Fraction of tiles carrying a powered trace', type: 'number', min: 0, max: 1, step: 0.01 },
51
- { name: 'chipChance', description: 'Fraction of tiles replaced by a chip; 0 disables chips', type: 'number', min: 0, max: 1, step: 0.01 },
52
- { name: 'padSize', description: 'Solder-pad size; 0 disables pads', type: 'number', min: 0, max: 2, step: 0.01 },
53
- ],
54
- voronoiGrid: [
55
- { name: 'jitter', description: '0 regular lattice, 1 fully scattered seeds', type: 'number', min: 0, max: 1, step: 0.01 },
56
- { name: 'drift', description: 'How far the seeds wander; 0 freezes the cells', type: 'number', min: 0, max: 2, step: 0.01 },
57
- ],
58
- radarGrid: [
59
- { name: 'spokes', description: 'Radial spokes; 0 disables them', type: 'number', min: 0, max: 72, step: 1 },
60
- { name: 'sweepWidth', description: 'Length of the sweep trail, as a fraction of a turn', type: 'number', min: 0, max: 1, step: 0.01 },
61
- { name: 'blipDensity', description: 'Chance a sector holds a blip', type: 'number', min: 0, max: 1, step: 0.01 },
62
- ],
63
- moireGrid: [
64
- { name: 'shape', description: 'Lattice shape of both layers', type: 'select', options: ['square', 'hex', 'rings'], optionLabels: ['Square', 'Hex', 'Rings'] },
65
- { name: 'layerAngle', description: 'Angle between the layers, in radians; small values beat slowly', type: 'number', min: 0, max: 0.5, step: 0.001 },
66
- { name: 'layerScale', description: 'Spacing ratio of the second layer; near 1 gives long beats', type: 'number', min: 0.8, max: 1.25, step: 0.001 },
67
- { name: 'spin', description: 'Counter-rotation speed; 0 freezes the pattern', type: 'number', min: -5, max: 5, step: 0.05 },
68
- ],
69
- fractalGrid: [
70
- { name: 'depth', description: 'Maximum subdivision levels', type: 'number', min: 1, max: 6, step: 1 },
71
- { name: 'splitRadius', description: 'Radius around the focus inside which cells subdivide', type: 'number', min: 0, max: 10, step: 0.05 },
72
- { name: 'splitJitter', description: 'Wobble of the split edge', type: 'number', min: 0, max: 1, step: 0.01 },
73
- ],
74
- contourGrid: [
75
- { name: 'levels', description: 'Contour steps across the height range', type: 'number', min: 2, max: 64, step: 1 },
76
- { name: 'roughness', description: 'Terrain roughness: 0.35 rolling, 0.65 craggy', type: 'number', min: 0, max: 1, step: 0.01 },
77
- { name: 'warp', description: 'Bends the contours into ridges and valleys', type: 'number', min: 0, max: 2, step: 0.01 },
78
- ],
79
- flowNetGrid: [
80
- { name: 'obstacleRadius', description: 'Cylinder radius, in cells', type: 'number', min: 0, max: 10, step: 0.05 },
81
- { name: 'circulation', description: 'Circulation around the cylinder (lift)', type: 'number', min: -6, max: 6, step: 1 },
82
- { name: 'flowAngle', description: 'Free-stream direction, in radians', type: 'number', min: -3.1416, max: 3.1416, step: 0.01 },
83
- ],
84
- chladniGrid: [
85
- { name: 'modeN', description: 'First mode number of the standing wave', type: 'number', min: 1, max: 12, step: 1 },
86
- { name: 'modeM', description: 'Second mode number of the standing wave', type: 'number', min: 1, max: 12, step: 1 },
87
- { name: 'morph', description: 'Drift to the neighbouring resonance; 0 holds the pattern', type: 'number', min: 0, max: 2, step: 0.01 },
88
- { name: 'grain', description: 'Amount of sand on the plate', type: 'number', min: 0, max: 1, step: 0.01 },
89
- ],
90
- hyperbolicGrid: [
91
- { name: 'sides', description: 'Sides of each polygon (p)', type: 'number', min: 3, max: 12, step: 1 },
92
- { name: 'valence', description: 'Polygons around each vertex (q)', type: 'number', min: 3, max: 12, step: 1 },
93
- { name: 'drift', description: 'How far the tiling glides through itself', type: 'number', min: 0, max: 1, step: 0.01 },
94
- ],
95
- gravWaveGrid: [
96
- { name: 'strain', description: 'Wave amplitude; 0 leaves only the static wells', type: 'number', min: 0, max: 3, step: 0.01 },
97
- { name: 'chirpTime', description: 'Seconds per inspiral-merger-ringdown cycle', type: 'number', min: 4, max: 60, step: 0.5 },
98
- { name: 'waveSpeed', description: 'Wave speed, in cells per second', type: 'number', min: 0.5, max: 20, step: 0.1 },
99
- { name: 'massRatio', description: 'Mass ratio m2/m1', type: 'number', min: 0.1, max: 1, step: 0.01 },
100
- ],
101
- girihGrid: [
102
- { name: 'tiling', description: 'Base tiling', type: 'select', options: ['0', '1', '2'], optionLabels: ['4.8.8', 'Hexagons', '3.6.3.6'] },
103
- { name: 'contactAngle', description: 'Hankin contact angle, degrees; 67.5 is the classic 8-point star', type: 'number', min: 20, max: 85, step: 0.5 },
104
- { name: 'strapWidth', description: 'Width of the strapwork band, in cells', type: 'number', min: 0, max: 0.3, step: 0.005 },
105
- { name: 'angleDrift', description: 'Degrees the contact angle drifts, morphing the pattern', type: 'number', min: 0, max: 30, step: 0.5 },
106
- ],
107
- wallpaperGrid: [
108
- { name: 'group', description: 'Wallpaper group (-1 cycles through all 17)', type: 'number', min: -1, max: 16, step: 1 },
109
- { name: 'cycleTime', description: 'Seconds per group while cycling', type: 'number', min: 1, max: 60, step: 0.5 },
110
- { name: 'motif', description: 'Motif complexity', type: 'number', min: 0, max: 1, step: 0.01 },
111
- { name: 'levels', description: 'Number of contour levels', type: 'number', min: 2, max: 32, step: 1 },
112
- ],
113
- reactionDiffusionGrid: [
114
- { name: 'feed', description: 'Gray-Scott feed rate F', type: 'number', min: 0.01, max: 0.08, step: 0.0005 },
115
- { name: 'kill', description: 'Gray-Scott kill rate k', type: 'number', min: 0.04, max: 0.075, step: 0.0005 },
116
- { name: 'variation', description: 'Spread of F and k across the tile, so morphologies coexist', type: 'number', min: 0, max: 1, step: 0.01 },
117
- { name: 'tileCells', description: 'Cells covered by one simulation tile', type: 'number', min: 1, max: 20, step: 1 },
118
- ],
119
- };
120
38
  /**
121
- * Grids that always lie flat (the parent object's transform orients them) and
122
- * leave pointer behaviour to the Pointer tab: their surface rows have no `flat`
123
- * and no `followMouse`. `section` re-describes `sectionSize` where the grid
124
- * gives it its own meaning (spiral count, bloom rings, inversion levels).
39
+ * Every grid: its own knobs, plus an optional `section` that re-describes
40
+ * `sectionSize` where the grid gives it its own meaning (spiral count, bloom
41
+ * rings, inversion levels). Grids always lie flat (the parent object's transform
42
+ * orients them) and leave pointer behaviour to the Pointer tab.
125
43
  */
126
- const SURFACE_PARENT_ORIENTED = GRID_SURFACE_PROPERTIES.filter((p) => p.name !== 'flat' && p.name !== 'followMouse');
127
- const surfaceFor = (section) => section ? SURFACE_PARENT_ORIENTED.map((p) => (p.name === 'sectionSize' ? { ...p, ...section } : p)) : SURFACE_PARENT_ORIENTED;
128
- const parentOriented = {
44
+ const surfaceFor = (section) => section ? GRID_SURFACE_PROPERTIES.map((p) => (p.name === 'sectionSize' ? { ...p, ...section } : p)) : GRID_SURFACE_PROPERTIES;
45
+ const GRID_OWN = {
46
+ advancedGrid: {
47
+ own: [],
48
+ },
49
+ quasiGrid: {
50
+ own: [
51
+ { name: 'symmetry', description: 'Line families, 3..9. 5 is Penrose; 4 and 6 come out periodic', type: 'number', min: 3, max: 9, step: 1 },
52
+ { name: 'phase', description: 'Slides the pattern through itself', type: 'number', min: 0, max: 1, step: 0.01 },
53
+ ],
54
+ },
55
+ hexGrid: {
56
+ own: [
57
+ { name: 'plateau', description: 'With displacement, each hex lifts as a flat plate', type: 'boolean' },
58
+ ],
59
+ },
60
+ circuitGrid: {
61
+ own: [
62
+ { name: 'powered', description: 'Fraction of tiles carrying a powered trace', type: 'number', min: 0, max: 1, step: 0.01 },
63
+ { name: 'chipChance', description: 'Fraction of tiles replaced by a chip; 0 disables chips', type: 'number', min: 0, max: 1, step: 0.01 },
64
+ { name: 'padSize', description: 'Solder-pad size; 0 disables pads', type: 'number', min: 0, max: 2, step: 0.01 },
65
+ ],
66
+ },
67
+ voronoiGrid: {
68
+ own: [
69
+ { name: 'jitter', description: '0 regular lattice, 1 fully scattered seeds', type: 'number', min: 0, max: 1, step: 0.01 },
70
+ { name: 'drift', description: 'How far the seeds wander; 0 freezes the cells', type: 'number', min: 0, max: 2, step: 0.01 },
71
+ ],
72
+ },
73
+ radarGrid: {
74
+ own: [
75
+ { name: 'spokes', description: 'Radial spokes; 0 disables them', type: 'number', min: 0, max: 72, step: 1 },
76
+ { name: 'sweepWidth', description: 'Length of the sweep trail, as a fraction of a turn', type: 'number', min: 0, max: 1, step: 0.01 },
77
+ { name: 'blipDensity', description: 'Chance a sector holds a blip', type: 'number', min: 0, max: 1, step: 0.01 },
78
+ ],
79
+ },
80
+ moireGrid: {
81
+ own: [
82
+ { name: 'shape', description: 'Lattice shape of both layers', type: 'select', options: ['square', 'hex', 'rings'], optionLabels: ['Square', 'Hex', 'Rings'] },
83
+ { name: 'layerAngle', description: 'Angle between the layers, in radians; small values beat slowly', type: 'number', min: 0, max: 0.5, step: 0.001 },
84
+ { name: 'layerScale', description: 'Spacing ratio of the second layer; near 1 gives long beats', type: 'number', min: 0.8, max: 1.25, step: 0.001 },
85
+ { name: 'spin', description: 'Counter-rotation speed; 0 freezes the pattern', type: 'number', min: -5, max: 5, step: 0.05 },
86
+ ],
87
+ },
88
+ fractalGrid: {
89
+ own: [
90
+ { name: 'depth', description: 'Maximum subdivision levels', type: 'number', min: 1, max: 6, step: 1 },
91
+ { name: 'splitRadius', description: 'Radius around the focus inside which cells subdivide', type: 'number', min: 0, max: 10, step: 0.05 },
92
+ { name: 'splitJitter', description: 'Wobble of the split edge', type: 'number', min: 0, max: 1, step: 0.01 },
93
+ ],
94
+ },
95
+ contourGrid: {
96
+ own: [
97
+ { name: 'levels', description: 'Contour steps across the height range', type: 'number', min: 2, max: 64, step: 1 },
98
+ { name: 'roughness', description: 'Terrain roughness: 0.35 rolling, 0.65 craggy', type: 'number', min: 0, max: 1, step: 0.01 },
99
+ { name: 'warp', description: 'Bends the contours into ridges and valleys', type: 'number', min: 0, max: 2, step: 0.01 },
100
+ ],
101
+ },
102
+ flowNetGrid: {
103
+ own: [
104
+ { name: 'obstacleRadius', description: 'Cylinder radius, in cells', type: 'number', min: 0, max: 10, step: 0.05 },
105
+ { name: 'circulation', description: 'Circulation around the cylinder (lift)', type: 'number', min: -6, max: 6, step: 1 },
106
+ { name: 'flowAngle', description: 'Free-stream direction, in radians', type: 'number', min: -3.1416, max: 3.1416, step: 0.01 },
107
+ ],
108
+ },
109
+ chladniGrid: {
110
+ own: [
111
+ { name: 'modeN', description: 'First mode number of the standing wave', type: 'number', min: 1, max: 12, step: 1 },
112
+ { name: 'modeM', description: 'Second mode number of the standing wave', type: 'number', min: 1, max: 12, step: 1 },
113
+ { name: 'morph', description: 'Drift to the neighbouring resonance; 0 holds the pattern', type: 'number', min: 0, max: 2, step: 0.01 },
114
+ { name: 'grain', description: 'Amount of sand on the plate', type: 'number', min: 0, max: 1, step: 0.01 },
115
+ ],
116
+ },
117
+ hyperbolicGrid: {
118
+ own: [
119
+ { name: 'sides', description: 'Sides of each polygon (p)', type: 'number', min: 3, max: 12, step: 1 },
120
+ { name: 'valence', description: 'Polygons around each vertex (q)', type: 'number', min: 3, max: 12, step: 1 },
121
+ { name: 'drift', description: 'How far the tiling glides through itself', type: 'number', min: 0, max: 1, step: 0.01 },
122
+ ],
123
+ },
124
+ gravWaveGrid: {
125
+ own: [
126
+ { name: 'strain', description: 'Wave amplitude; 0 leaves only the static wells', type: 'number', min: 0, max: 3, step: 0.01 },
127
+ { name: 'chirpTime', description: 'Seconds per inspiral-merger-ringdown cycle', type: 'number', min: 4, max: 60, step: 0.5 },
128
+ { name: 'waveSpeed', description: 'Wave speed, in cells per second', type: 'number', min: 0.5, max: 20, step: 0.1 },
129
+ { name: 'massRatio', description: 'Mass ratio m2/m1', type: 'number', min: 0.1, max: 1, step: 0.01 },
130
+ ],
131
+ },
132
+ girihGrid: {
133
+ own: [
134
+ { name: 'tiling', description: 'Base tiling', type: 'select', options: ['0', '1', '2'], optionLabels: ['4.8.8', 'Hexagons', '3.6.3.6'] },
135
+ { name: 'contactAngle', description: 'Hankin contact angle, degrees; 67.5 is the classic 8-point star', type: 'number', min: 20, max: 85, step: 0.5 },
136
+ { name: 'strapWidth', description: 'Width of the strapwork band, in cells', type: 'number', min: 0, max: 0.3, step: 0.005 },
137
+ { name: 'angleDrift', description: 'Degrees the contact angle drifts, morphing the pattern', type: 'number', min: 0, max: 30, step: 0.5 },
138
+ ],
139
+ },
140
+ wallpaperGrid: {
141
+ own: [
142
+ { name: 'group', description: 'Wallpaper group (-1 cycles through all 17)', type: 'number', min: -1, max: 16, step: 1 },
143
+ { name: 'cycleTime', description: 'Seconds per group while cycling', type: 'number', min: 1, max: 60, step: 0.5 },
144
+ { name: 'motif', description: 'Motif complexity', type: 'number', min: 0, max: 1, step: 0.01 },
145
+ { name: 'levels', description: 'Number of contour levels', type: 'number', min: 2, max: 32, step: 1 },
146
+ ],
147
+ },
148
+ reactionDiffusionGrid: {
149
+ own: [
150
+ { name: 'feed', description: 'Gray-Scott feed rate F', type: 'number', min: 0.01, max: 0.08, step: 0.0005 },
151
+ { name: 'kill', description: 'Gray-Scott kill rate k', type: 'number', min: 0.04, max: 0.075, step: 0.0005 },
152
+ { name: 'variation', description: 'Spread of F and k across the tile, so morphologies coexist', type: 'number', min: 0, max: 1, step: 0.01 },
153
+ { name: 'tileCells', description: 'Cells covered by one simulation tile', type: 'number', min: 1, max: 20, step: 1 },
154
+ ],
155
+ },
129
156
  lensingGrid: {
130
157
  own: [
131
158
  { name: 'mass', description: "Einstein radius of the lens, in cells; 0 leaves the lattice undistorted", type: 'number', min: 0, max: 12, step: 0.1 },
@@ -193,7 +220,4 @@ const parentOriented = {
193
220
  },
194
221
  };
195
222
  /** Every shader-plane grid's inputs: its own knobs first, then the shared surface. */
196
- export const GRID_PROPERTIES = Object.fromEntries(Object.entries(own).map(([type, props]) => [type, [...props, ...GRID_SURFACE_PROPERTIES]]));
197
- for (const [type, { own: props, section }] of Object.entries(parentOriented)) {
198
- GRID_PROPERTIES[type] = [...props, ...surfaceFor(section)];
199
- }
223
+ export const GRID_PROPERTIES = Object.fromEntries(Object.entries(GRID_OWN).map(([type, { own, section }]) => [type, [...own, ...surfaceFor(section)]]));
@@ -3,6 +3,10 @@ export * from './lightProperties';
3
3
  export * from './particlesProperties';
4
4
  export * from './effectsProperties';
5
5
  export * from './gridProperties';
6
+ export * from './environmentProperties';
7
+ export * from './spaceProperties';
8
+ export * from './landProperties';
9
+ export * from './textProperties';
6
10
  export * from './materialBounds';
7
11
  export * from './geometryProperties';
8
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/properties/tables/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/properties/tables/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC"}
@@ -3,5 +3,9 @@ export * from './lightProperties.js';
3
3
  export * from './particlesProperties.js';
4
4
  export * from './effectsProperties.js';
5
5
  export * from './gridProperties.js';
6
+ export * from './environmentProperties.js';
7
+ export * from './spaceProperties.js';
8
+ export * from './landProperties.js';
9
+ export * from './textProperties.js';
6
10
  export * from './materialBounds.js';
7
11
  export * from './geometryProperties.js';
@@ -0,0 +1,5 @@
1
+ import { type OptionalProperty } from './optionalProperties';
2
+ import type { LandObjectType } from '../../types/landObjects';
3
+ export declare const landOwnProperties: OptionalProperty[];
4
+ export declare const LAND_PROPERTIES: Record<LandObjectType, OptionalProperty[]>;
5
+ //# sourceMappingURL=landProperties.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"landProperties.d.ts","sourceRoot":"","sources":["../../../src/properties/tables/landProperties.ts"],"names":[],"mappings":"AACA,OAAO,EAA6B,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAW9D,eAAO,MAAM,iBAAiB,EAAE,gBAAgB,EAI/C,CAAC;AAOF,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,cAAc,EAAE,gBAAgB,EAAE,CAKtE,CAAC"}