/
ProjectMetadata.ts
84 lines (78 loc) · 2.19 KB
/
ProjectMetadata.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import {
ColorMetaField,
EnumMetaField,
ExporterMetaField,
MetaField,
NumberMetaField,
ObjectMetaField,
RangeMetaField,
Vector2MetaField,
} from '../meta';
import {CanvasColorSpace, Color, Vector2} from '../types';
import {ColorSpaces, FrameRates, Scales} from './presets';
import type {Project} from './Project';
function createProjectMetadata(project: Project) {
const meta = {
version: new MetaField('version', 1),
shared: new ObjectMetaField('General', {
background: new ColorMetaField('background', null),
range: new RangeMetaField('range', [0, Infinity]),
size: new Vector2MetaField('resolution', new Vector2(1920, 1080)),
audioOffset: new NumberMetaField('audio offset', 0),
}),
preview: new ObjectMetaField('Preview', {
fps: new NumberMetaField('frame rate', 30)
.setPresets(FrameRates)
.setRange(1),
resolutionScale: new EnumMetaField('scale', Scales, 1),
}),
rendering: new ObjectMetaField('Rendering', {
fps: new NumberMetaField('frame rate', 60)
.setPresets(FrameRates)
.setRange(1),
resolutionScale: new EnumMetaField('scale', Scales, 1),
colorSpace: new EnumMetaField('color space', ColorSpaces),
exporter: new ExporterMetaField('exporter', project),
}),
};
meta.shared.audioOffset.disable(!project.audio);
return meta;
}
export class ProjectMetadata extends ObjectMetaField<
ReturnType<typeof createProjectMetadata>
> {
public constructor(project: Project) {
super('project', createProjectMetadata(project));
}
public getFullPreviewSettings(): {
fps: number;
resolutionScale: number;
background: Color | null;
range: [number, number];
size: Vector2;
audioOffset: number;
} {
return {
...this.shared.get(),
...this.preview.get(),
};
}
public getFullRenderingSettings(): {
fps: number;
resolutionScale: number;
colorSpace: CanvasColorSpace;
background: Color | null;
range: [number, number];
size: Vector2;
audioOffset: number;
exporter: {
name: string;
options: unknown;
};
} {
return {
...this.shared.get(),
...this.rendering.get(),
};
}
}