@3driseai/3drise-core 1.0.22 → 1.0.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/catalog/catalogInfo.js +4 -4
- package/dist/catalog/objectCatalog.d.ts.map +1 -1
- package/dist/catalog/objectCatalog.js +2 -7
- package/dist/data/defaults.d.ts +0 -12
- package/dist/data/defaults.d.ts.map +1 -1
- package/dist/data/defaults.js +0 -12
- package/dist/data/textDefaults.d.ts +1 -1
- package/dist/data/textDefaults.d.ts.map +1 -1
- package/dist/data/textDefaults.js +34 -14
- package/dist/properties/registry.d.ts +10 -5
- package/dist/properties/registry.d.ts.map +1 -1
- package/dist/properties/registry.js +49 -14
- package/dist/properties/tables/geometryProperties.d.ts +7 -0
- package/dist/properties/tables/geometryProperties.d.ts.map +1 -1
- package/dist/properties/tables/geometryProperties.js +9 -1
- package/dist/properties/tables/optionalProperties.d.ts.map +1 -1
- package/dist/properties/tables/optionalProperties.js +1 -0
- package/dist/properties/tables/textProperties.d.ts.map +1 -1
- package/dist/properties/tables/textProperties.js +38 -12
- package/dist/properties/types.d.ts +1 -1
- package/dist/properties/types.d.ts.map +1 -1
- package/dist/services/SceneActions.d.ts +9 -0
- package/dist/services/SceneActions.d.ts.map +1 -1
- package/dist/services/SceneActions.js +30 -0
- package/dist/three/LetterV.d.ts +7 -1
- package/dist/three/LetterV.d.ts.map +1 -1
- package/dist/three/Text2DV.d.ts +7 -1
- package/dist/three/Text2DV.d.ts.map +1 -1
- package/dist/three/Text3DV.d.ts +7 -1
- package/dist/three/Text3DV.d.ts.map +1 -1
- package/dist/types/actions.d.ts +0 -1
- package/dist/types/actions.d.ts.map +1 -1
- package/dist/types/index.d.ts +0 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/objectSettings.d.ts +2 -0
- package/dist/types/objectSettings.d.ts.map +1 -1
- package/dist/types/scene3d.d.ts +4 -0
- package/dist/types/scene3d.d.ts.map +1 -1
- package/dist/types/textObjects.d.ts +22 -3
- package/dist/types/textObjects.d.ts.map +1 -1
- package/dist/types/textObjects.js +3 -3
- package/dist/utils/dataUtils.d.ts.map +1 -1
- package/dist/utils/dataUtils.js +0 -6
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/objectEffects.d.ts +2 -2
- package/dist/utils/objectEffects.d.ts.map +1 -1
- package/dist/utils/objectEffects.js +3 -4
- package/dist/utils/objectMigration.d.ts.map +1 -1
- package/dist/utils/objectMigration.js +2 -1
- package/dist/utils/textMigration.d.ts +3 -0
- package/dist/utils/textMigration.d.ts.map +1 -0
- package/dist/utils/textMigration.js +56 -0
- package/package.json +1 -1
|
@@ -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
|
|
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: "
|
|
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"] },
|
|
@@ -186,8 +187,7 @@ export const CATALOG_VARIANTS = {
|
|
|
186
187
|
{ 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
188
|
],
|
|
188
189
|
text: [
|
|
189
|
-
{ key: "
|
|
190
|
-
{ key: "3dText", legacyId: "992fe6fa-0d34-4d07-a600-0acee0c881fa", name: "3d text", description: "3d text", tags: ["text"], config: { text: "Hello", renderMode: "text3d" } },
|
|
190
|
+
{ 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
191
|
{ 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
192
|
{ 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
193
|
{ 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":"
|
|
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)
|
|
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
|
|
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))];
|
package/dist/data/defaults.d.ts
CHANGED
|
@@ -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
|
|
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"}
|
package/dist/data/defaults.js
CHANGED
|
@@ -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,
|
|
@@ -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
|
|
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,
|
|
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',
|
|
12
|
-
neonTube: { type: 'neonTube',
|
|
13
|
-
fourierSketch: { type: 'fourierSketch',
|
|
14
|
-
frostGrowth: { type: 'frostGrowth',
|
|
15
|
-
plasmaDischarge: { type: 'plasmaDischarge',
|
|
16
|
-
burnAway: { type: 'burnAway',
|
|
17
|
-
lightPainting: { type: 'lightPainting',
|
|
18
|
-
constellation: { type: 'constellation',
|
|
19
|
-
inkBleed: { type: 'inkBleed',
|
|
20
|
-
liquidMetal: { type: 'liquidMetal',
|
|
21
|
-
embroidery: { type: 'embroidery',
|
|
22
|
-
chalkboard: { type: 'chalkboard',
|
|
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
|
|
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);
|
|
@@ -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":"
|
|
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;AAUlI;;;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"}
|
|
@@ -5,9 +5,9 @@ import { GRIDS_ANIMATABLE } from '../data/gridsDefaults.js';
|
|
|
5
5
|
import { ENVIRONMENT_OBJECTS_ANIMATABLE } from '../data/environmentDefaults.js';
|
|
6
6
|
import { LAND_OBJECTS_ANIMATABLE } from '../data/landDefaults.js';
|
|
7
7
|
import { SPACE_OBJECTS_ANIMATABLE } from '../data/spaceDefaults.js';
|
|
8
|
-
import { TEXT_OBJECTS_ANIMATABLE
|
|
8
|
+
import { TEXT_OBJECTS_ANIMATABLE } from '../data/textDefaults.js';
|
|
9
9
|
import { CLOUD_ANIMATABLE_PROPERTIES } from '../environment/cloudConfigs.js';
|
|
10
|
-
import { skyOptionalProperties, skyStarsOptionalProperties, cloudDeckOptionalProperties, cirrusOptionalProperties, oceanSurfaceOptionalProperties, terrainOptionalProperties, rainOptionalProperties, cloudsOptionalProperties,
|
|
10
|
+
import { skyOptionalProperties, skyStarsOptionalProperties, cloudDeckOptionalProperties, cirrusOptionalProperties, thunderOptionalProperties, oceanSurfaceOptionalProperties, terrainOptionalProperties, rainOptionalProperties, cloudsOptionalProperties, plainOptionalProperties, pathOptionalProperties, edgesOptionalProperties, } from './tables/optionalProperties.js';
|
|
11
11
|
import { SHAPE_CONTROLS, MODE_CONTROLS } from './tables/geometryProperties.js';
|
|
12
12
|
import { LIGHT_PROPERTIES, SHADOW_PROPERTIES } from './tables/lightProperties.js';
|
|
13
13
|
import { PARTICLES_PROPERTIES } from './tables/particlesProperties.js';
|
|
@@ -34,13 +34,9 @@ const MATERIAL_STRUCTURAL = new Set([
|
|
|
34
34
|
* Objects that own their shader: their materialSettings (if any) never reach the
|
|
35
35
|
* renderer, so they have no material properties. They animate through config.
|
|
36
36
|
*/
|
|
37
|
-
export const SELF_MANAGED_MATERIAL_TYPES = new Set(['effect', 'grid', 'light', 'particles', 'environment', 'space', 'land']);
|
|
38
|
-
/**
|
|
39
|
-
|
|
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)));
|
|
37
|
+
export const SELF_MANAGED_MATERIAL_TYPES = new Set(['effect', 'grid', 'light', 'particles', 'environment', 'space', 'land', 'text']);
|
|
38
|
+
/** True when the object draws with its own shaders (the object types above): it gets no material specs. */
|
|
39
|
+
export const selfManagesMaterial = (obj) => !!obj && SELF_MANAGED_MATERIAL_TYPES.has(obj.type);
|
|
44
40
|
const CAMERA_SPECS = [
|
|
45
41
|
{ key: 'position', name: 'position', label: 'Position', kind: 'vec3', domain: 'camera', animatable: true },
|
|
46
42
|
{ key: 'controls.target', name: 'target', label: 'Target', kind: 'vec3', domain: 'camera', animatable: true },
|
|
@@ -192,6 +188,8 @@ function controlSpecs(controls, prefix, group) {
|
|
|
192
188
|
animatable: false,
|
|
193
189
|
default: c.default,
|
|
194
190
|
};
|
|
191
|
+
if (c.type === 'select')
|
|
192
|
+
spec.options = c.options.map((value, i) => (c.optionLabels?.[i] ? { value, label: c.optionLabels[i] } : { value }));
|
|
195
193
|
if (c.type === 'range') {
|
|
196
194
|
spec.min = c.min;
|
|
197
195
|
spec.max = c.max;
|
|
@@ -249,7 +247,7 @@ function familyOf(obj) {
|
|
|
249
247
|
// Land objects only under their own object type: their keys are landform names ('hills'…).
|
|
250
248
|
if (type === 'land' && LAND_OBJECTS_ANIMATABLE[t])
|
|
251
249
|
return land();
|
|
252
|
-
// Text looks only under the text object type,
|
|
250
|
+
// Text looks only under the text object type (plain, handwriting, …).
|
|
253
251
|
if (type === 'text' && TEXT_OBJECTS_ANIMATABLE[t])
|
|
254
252
|
return text();
|
|
255
253
|
if (t === 'rain')
|
|
@@ -266,8 +264,6 @@ function familyOf(obj) {
|
|
|
266
264
|
if (GENERATIVE_PARTICLES_ANIMATABLE[t])
|
|
267
265
|
return particles();
|
|
268
266
|
}
|
|
269
|
-
if (type === 'text')
|
|
270
|
-
return { domain: 'config', list: textOptionalProperties, animatable: null };
|
|
271
267
|
if (type === 'plain')
|
|
272
268
|
return { domain: 'config', list: plainOptionalProperties, animatable: null };
|
|
273
269
|
if (type === 'path')
|
|
@@ -300,6 +296,15 @@ function configSpecs(obj) {
|
|
|
300
296
|
const kind = kindOfValue(name, obj?.config?.[name]) ?? 'number';
|
|
301
297
|
out.push({ key: `${prefix}${name}`, name, label: label || propertyLabel(name), kind, domain, animatable: true });
|
|
302
298
|
}
|
|
299
|
+
// Text's draw / erase trigger (config.shown: on plays the draw animation, off the erase).
|
|
300
|
+
// Its controller shows it as the Shown button; the per-look tables don't list it.
|
|
301
|
+
if (domain === 'text' && !seen.has('shown')) {
|
|
302
|
+
out.push({
|
|
303
|
+
key: `${prefix}shown`, name: 'shown', label: 'Shown',
|
|
304
|
+
description: 'The draw / erase trigger: switching it on plays the draw animation, off plays the erase animation (the text then stays hidden)',
|
|
305
|
+
kind: 'boolean', domain, animatable: false, default: true,
|
|
306
|
+
});
|
|
307
|
+
}
|
|
303
308
|
if (domain === 'light') {
|
|
304
309
|
for (const p of SHADOW_PROPERTIES[obj.config.type] ?? []) {
|
|
305
310
|
out.push({ ...fromOptional(p, 'config.shadow.', 'shadow', false), group: 'shadow' });
|
|
@@ -332,6 +337,7 @@ function environmentSpecs(element, settings) {
|
|
|
332
337
|
return [
|
|
333
338
|
...envSpecs(cloudDeckOptionalProperties(settings?.config?.deckType), 'config.', 'clouds'),
|
|
334
339
|
...envSpecs(cirrusOptionalProperties, 'cirrus.', 'cirrus'),
|
|
340
|
+
...envSpecs(thunderOptionalProperties, 'thunder.', 'thunder'),
|
|
335
341
|
];
|
|
336
342
|
case 'ocean':
|
|
337
343
|
return envSpecs(oceanSurfaceOptionalProperties(settings?.config?.waterType, settings?.config?.host), 'config.', 'ocean');
|
|
@@ -359,8 +365,14 @@ export function getPropertySpecs(element, settings) {
|
|
|
359
365
|
export function isPropertyLive(element, spec, settings) {
|
|
360
366
|
if (spec.domain === 'edges')
|
|
361
367
|
return settings?.edgesSettings?.enabled !== false;
|
|
362
|
-
if (element === 'clouds')
|
|
363
|
-
|
|
368
|
+
if (element === 'clouds') {
|
|
369
|
+
if (spec.domain === 'cirrus')
|
|
370
|
+
return !!settings?.cirrus?.enabled;
|
|
371
|
+
// Lightning needs cloud to strike in: the deck, and the thunder block itself.
|
|
372
|
+
if (spec.domain === 'thunder')
|
|
373
|
+
return !!settings?.config?.enabled && (spec.name === 'enabled' || !!settings?.thunder?.enabled);
|
|
374
|
+
return !!settings?.config?.enabled;
|
|
375
|
+
}
|
|
364
376
|
if (spec.domain === 'stars')
|
|
365
377
|
return settings?.stars?.visible !== false;
|
|
366
378
|
return true;
|
|
@@ -383,6 +395,29 @@ export function getTrackSpecs(element, settings) {
|
|
|
383
395
|
return specs;
|
|
384
396
|
return specs.filter(s => s.domain === 'transform' || s.domain === 'material' || s.domain === 'edges' || TRACK_CONFIG_DOMAINS.has(s.domain));
|
|
385
397
|
}
|
|
398
|
+
/**
|
|
399
|
+
* Text settings that configure HOW it draws / erases / replays — read only when a draw or
|
|
400
|
+
* erase starts, so keying them changes nothing you'd see. The timeline drives text with
|
|
401
|
+
* Shown (config.enabled) instead; these stay panel settings.
|
|
402
|
+
*/
|
|
403
|
+
const TEXT_LIFECYCLE = new Set([
|
|
404
|
+
'drawMethod', 'drawDuration', 'drawEase', 'drawStagger', 'drawAngle',
|
|
405
|
+
'eraseMethod', 'eraseDuration', 'eraseEase', 'eraseStagger', 'eraseAngle',
|
|
406
|
+
'autoPlay', 'loop', 'yoyo', 'holdTime', 'hiddenTime',
|
|
407
|
+
]);
|
|
408
|
+
/** Kinds a structural (discrete) track can hold: a key value the timeline can edit. */
|
|
409
|
+
const DISCRETE_KINDS = new Set(['number', 'boolean', 'string', 'select', 'color', 'vec3', 'vec2']);
|
|
410
|
+
/**
|
|
411
|
+
* Structural properties a clip can key as DISCRETE tracks (timeline): not writable per
|
|
412
|
+
* frame, so the clip sets them at its keys — the runtime lays the values at the playhead
|
|
413
|
+
* over the element's settings through the SceneActions patch layer, like an action, and
|
|
414
|
+
* the element re-renders. Every domain qualifies (it goes through the settings path, not
|
|
415
|
+
* a live handle); textures don't (no key editor for them). Not filtered by
|
|
416
|
+
* isPropertyLive: the switch that turns a layer on is itself one of these.
|
|
417
|
+
*/
|
|
418
|
+
export function getDiscreteTrackSpecs(element, settings) {
|
|
419
|
+
return getPropertySpecs(element, settings).filter(s => !s.animatable && DISCRETE_KINDS.has(s.kind) && !(s.domain === 'text' && TEXT_LIFECYCLE.has(s.name)));
|
|
420
|
+
}
|
|
386
421
|
export function getPropertySpec(element, settings, key) {
|
|
387
422
|
return getPropertySpecs(element, settings).find(s => s.key === key);
|
|
388
423
|
}
|
|
@@ -20,6 +20,13 @@ export type ControlOf<K extends string> = {
|
|
|
20
20
|
key: K;
|
|
21
21
|
label: string;
|
|
22
22
|
default: string;
|
|
23
|
+
} | {
|
|
24
|
+
type: 'select';
|
|
25
|
+
key: K;
|
|
26
|
+
label: string;
|
|
27
|
+
options: string[];
|
|
28
|
+
optionLabels?: string[];
|
|
29
|
+
default: string;
|
|
23
30
|
};
|
|
24
31
|
type OptKey = keyof GeometryShapeConfig & string;
|
|
25
32
|
export declare const SHAPE_CONTROLS: Record<ShapeName, ControlOf<OptKey>[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geometryProperties.d.ts","sourceRoot":"","sources":["../../../src/properties/tables/geometryProperties.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,mBAAmB,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"geometryProperties.d.ts","sourceRoot":"","sources":["../../../src/properties/tables/geometryProperties.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,mBAAmB,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAG9G,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,MAAM,IAClC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;CAAE,GACjK;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAY3G,KAAK,MAAM,GAAG,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAGjD,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CA4CjE,CAAC;AAEF,eAAO,MAAM,UAAU,EAAkC,SAAS,EAAE,CAAC;AAErE,wBAAgB,mBAAmB,CAAC,IAAI,GAAE,SAAmB,GAAG,mBAAmB,CAIlF;AAED,wBAAgB,kBAAkB,CAAC,IAAI,GAAE,SAAmB,GAAG,mBAAmB,CAEjF;AAED,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,WAAqB,GAAG,UAAU,CAEzE;AAED,KAAK,MAAM,GAAG,MAAM,UAAU,GAAG,MAAM,CAAC;AAIxC,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,WAAW,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAYlE,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,WAAW,EAAE,CAAA;CAAE,EAInE,CAAC;AAGF,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAYlD,CAAC"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
import { TEXT_FONTS } from '../../data/textDefaults.js';
|
|
1
2
|
const int = (key, label, min, max, def) => ({ type: 'range', key, label, min, max, step: 1, default: def });
|
|
2
3
|
const num = (key, label, min, max, step, def) => ({ type: 'range', key, label, min, max, step, default: def, digits: 2 });
|
|
3
4
|
const ang = (key, label, def) => ({ type: 'range', key, label, min: 0, max: Math.PI * 2, step: 0.05, default: def, digits: 2, unit: 'rad' });
|
|
4
5
|
const str = (key, label, def) => ({ type: 'text', key, label, default: def });
|
|
6
|
+
const sel = (key, label, options, optionLabels, def) => ({ type: 'select', key, label, options, optionLabels, default: def });
|
|
7
|
+
const tog = (key, label, def) => ({ type: 'toggle', key, label, default: def });
|
|
5
8
|
const CURVE = int('curveSegments', 'Curve detail', 6, 160, 64);
|
|
6
9
|
export const SHAPE_CONTROLS = {
|
|
7
10
|
heart: [CURVE],
|
|
@@ -39,7 +42,12 @@ export const SHAPE_CONTROLS = {
|
|
|
39
42
|
arcPlane: [num('radius', 'Radius', 0.2, 3, 0.01, 1), num('width', 'Band width', 0.02, 1, 0.01, 0.2), ang('startAngle', 'Start angle', 0), ang('endAngle', 'End angle', Math.PI), int('segments', 'Segments', 3, 128, 32)],
|
|
40
43
|
bentPlane: [num('radius', 'Radius', 0.2, 5, 0.01, 2), num('height', 'Height', 0.1, 3, 0.01, 1), ang('arc', 'Arc', Math.PI / 2), int('widthSegments', 'Width segments', 1, 64, 32), int('heightSegments', 'Height segments', 1, 64, 1)],
|
|
41
44
|
bentPlaneInverse: [num('radius', 'Radius', 0.2, 5, 0.01, 2), num('height', 'Height', 0.1, 3, 0.01, 1), ang('arc', 'Arc', Math.PI / 2), int('widthSegments', 'Width segments', 1, 64, 32), int('heightSegments', 'Height segments', 1, 64, 1)],
|
|
42
|
-
|
|
45
|
+
// the string extruded into a solid from the packed outline fonts (the text looks' font list)
|
|
46
|
+
text: [
|
|
47
|
+
str('text', 'Text', 'Hello'), sel('font', 'Font', TEXT_FONTS.map((f) => f.id), TEXT_FONTS.map((f) => f.label), 'inter'),
|
|
48
|
+
num('size', 'Size', 0.2, 3, 0.01, 1), num('height', 'Depth', 0.02, 1, 0.01, 0.2), num('letterSpacing', 'Letter spacing', -0.1, 0.5, 0.005, 0),
|
|
49
|
+
tog('bevelEnabled', 'Bevel', true), num('bevelThickness', 'Bevel depth', 0, 0.1, 0.002, 0.02), num('bevelSize', 'Bevel size', 0, 0.1, 0.002, 0.015), int('bevelSegments', 'Bevel segments', 1, 8, 3),
|
|
50
|
+
],
|
|
43
51
|
point: [num('size', 'Size', 0.02, 0.5, 0.01, 0.1)],
|
|
44
52
|
custom: [],
|
|
45
53
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"optionalProperties.d.ts","sourceRoot":"","sources":["../../../src/properties/tables/optionalProperties.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,gBAAgB;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IACnF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,gFAAgF;IAChF,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,uGAAuG;IACvG,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;gFAC4E;IAC5E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,4DAA4D;IAC5D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAID,eAAO,MAAM,qBAAqB,EAAE,gBAAgB,EAOnD,CAAC;AAIF,eAAO,MAAM,0BAA0B,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"optionalProperties.d.ts","sourceRoot":"","sources":["../../../src/properties/tables/optionalProperties.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,7 @@ export const skyOptionalProperties = [
|
|
|
11
11
|
// The sky's built-in stars (SkyStars): keyed under `stars.` on SkySettings. count and
|
|
12
12
|
// milkyWay rebuild the dome, so they are structural; the rest are uniforms.
|
|
13
13
|
export const skyStarsOptionalProperties = [
|
|
14
|
+
{ name: 'visible', label: 'Visible', description: 'Show the night sky. With a sky on they come out after dark; with no sky they are a stand-alone layer', type: 'boolean', animatable: false, default: true },
|
|
14
15
|
{ name: 'brightness', label: 'Brightness', description: 'How bright the stars are once it is dark', type: 'number', min: 0, max: 4, step: 0.05, default: 1 },
|
|
15
16
|
{ name: 'count', label: 'Count', description: 'How many stars fill the sky', type: 'number', min: 500, max: 20000, step: 100, animatable: false, default: 4000 },
|
|
16
17
|
{ name: 'size', label: 'Size', description: 'Size of the star points', type: 'number', min: 0.3, max: 3, step: 0.05, default: 1 },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textProperties.d.ts","sourceRoot":"","sources":["../../../src/properties/tables/textProperties.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAO9D,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,cAAc,EAAE,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"textProperties.d.ts","sourceRoot":"","sources":["../../../src/properties/tables/textProperties.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAO9D,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,cAAc,EAAE,gBAAgB,EAAE,CA8XtE,CAAC"}
|