angular-three-theatre 4.0.0-next.100
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/README.md +1 -0
- package/fesm2022/angular-three-theatre.mjs +738 -0
- package/fesm2022/angular-three-theatre.mjs.map +1 -0
- package/index.d.ts +8 -0
- package/lib/project.d.ts +11 -0
- package/lib/sequence.d.ts +65 -0
- package/lib/sheet-object/index.d.ts +7 -0
- package/lib/sheet-object/sheet-object.d.ts +34 -0
- package/lib/sheet-object/sync.d.ts +23 -0
- package/lib/sheet-object/transform.d.ts +26 -0
- package/lib/sheet.d.ts +9 -0
- package/lib/studio/studio-token.d.ts +3 -0
- package/lib/studio/studio.d.ts +10 -0
- package/lib/transformers/color.d.ts +1 -0
- package/lib/transformers/default-transformer.d.ts +1 -0
- package/lib/transformers/degrees.d.ts +1 -0
- package/lib/transformers/euler.d.ts +1 -0
- package/lib/transformers/generic.d.ts +1 -0
- package/lib/transformers/normalized.d.ts +1 -0
- package/lib/transformers/side.d.ts +1 -0
- package/lib/transformers/transformer.d.ts +21 -0
- package/package.json +47 -0
package/README.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# `angular-three-theatre`
|
|
@@ -0,0 +1,738 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { input, computed, effect, Component, ChangeDetectionStrategy, inject, DestroyRef, Directive, InjectionToken, booleanAttribute, model, TemplateRef, ViewContainerRef, untracked, linkedSignal, viewChild, afterNextRender, CUSTOM_ELEMENTS_SCHEMA, signal } from '@angular/core';
|
|
3
|
+
import { getProject, types, val, onChange } from '@theatre/core';
|
|
4
|
+
import { injectStore, resolveRef, resolveInstanceKey, extend, omit, pick } from 'angular-three';
|
|
5
|
+
import * as THREE from 'three';
|
|
6
|
+
import { Group } from 'three';
|
|
7
|
+
import { NgtsTransformControls } from 'angular-three-soba/gizmos';
|
|
8
|
+
import { mergeInputs } from 'ngxtension/inject-inputs';
|
|
9
|
+
|
|
10
|
+
class TheatreProject {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.name = input('default-theatre-project');
|
|
13
|
+
this.config = input({});
|
|
14
|
+
this.project = computed(() => getProject(this.name(), this.config()));
|
|
15
|
+
this.sheets = {};
|
|
16
|
+
effect(() => {
|
|
17
|
+
const project = this.project();
|
|
18
|
+
project.ready.then();
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: TheatreProject, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
22
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.1", type: TheatreProject, isStandalone: true, selector: "theatre-project", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
23
|
+
<ng-content />
|
|
24
|
+
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
25
|
+
}
|
|
26
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: TheatreProject, decorators: [{
|
|
27
|
+
type: Component,
|
|
28
|
+
args: [{
|
|
29
|
+
selector: 'theatre-project',
|
|
30
|
+
template: `
|
|
31
|
+
<ng-content />
|
|
32
|
+
`,
|
|
33
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
34
|
+
}]
|
|
35
|
+
}], ctorParameters: () => [] });
|
|
36
|
+
|
|
37
|
+
let TheatreSheet$1 = class TheatreSheet {
|
|
38
|
+
constructor() {
|
|
39
|
+
this.name = input('default-theatre-sheet', {
|
|
40
|
+
transform: (value) => {
|
|
41
|
+
if (value === '')
|
|
42
|
+
return 'default-theatre-sheet';
|
|
43
|
+
return value;
|
|
44
|
+
},
|
|
45
|
+
alias: 'sheet',
|
|
46
|
+
});
|
|
47
|
+
this.project = inject(TheatreProject);
|
|
48
|
+
this.sheet = computed(() => {
|
|
49
|
+
const name = this.name();
|
|
50
|
+
const existing = this.project.sheets[name] || [];
|
|
51
|
+
if (existing[0]) {
|
|
52
|
+
existing[1]++;
|
|
53
|
+
return existing[0];
|
|
54
|
+
}
|
|
55
|
+
const sheet = this.project.project().sheet(name);
|
|
56
|
+
this.project.sheets[name] = [sheet, 1];
|
|
57
|
+
return sheet;
|
|
58
|
+
});
|
|
59
|
+
inject(DestroyRef).onDestroy(() => {
|
|
60
|
+
const existing = this.project.sheets[this.name()];
|
|
61
|
+
if (!existing)
|
|
62
|
+
return;
|
|
63
|
+
if (existing[1] >= 1) {
|
|
64
|
+
existing[1]--;
|
|
65
|
+
}
|
|
66
|
+
if (existing[1] === 0) {
|
|
67
|
+
delete this.project.sheets[this.name()];
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: TheatreSheet, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
72
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.2.1", type: TheatreSheet, isStandalone: true, selector: "[sheet]", inputs: { name: { classPropertyName: "name", publicName: "sheet", isSignal: true, isRequired: false, transformFunction: null } }, exportAs: ["sheet"], ngImport: i0 }); }
|
|
73
|
+
};
|
|
74
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: TheatreSheet$1, decorators: [{
|
|
75
|
+
type: Directive,
|
|
76
|
+
args: [{ selector: '[sheet]', exportAs: 'sheet' }]
|
|
77
|
+
}], ctorParameters: () => [] });
|
|
78
|
+
|
|
79
|
+
const THEATRE_STUDIO = new InjectionToken('Theatre Studio');
|
|
80
|
+
|
|
81
|
+
let TheatreSheetObject$1 = class TheatreSheetObject {
|
|
82
|
+
constructor() {
|
|
83
|
+
this.key = input.required({ alias: 'sheetObject' });
|
|
84
|
+
this.props = input({}, { alias: 'sheetObjectProps' });
|
|
85
|
+
this.detach = input(false, { transform: booleanAttribute, alias: 'sheetObjectDetach' });
|
|
86
|
+
this.selected = model(false, { alias: 'sheetObjectSelected' });
|
|
87
|
+
this.templateRef = inject(TemplateRef);
|
|
88
|
+
this.vcr = inject(ViewContainerRef);
|
|
89
|
+
this.sheet = inject(TheatreSheet$1);
|
|
90
|
+
this.studio = inject(THEATRE_STUDIO, { optional: true });
|
|
91
|
+
this.store = injectStore();
|
|
92
|
+
this.originalSheetObject = computed(() => {
|
|
93
|
+
const sheet = this.sheet.sheet();
|
|
94
|
+
return sheet.object(this.key(), untracked(this.props), { reconfigure: true });
|
|
95
|
+
});
|
|
96
|
+
this.sheetObject = linkedSignal(this.originalSheetObject);
|
|
97
|
+
this.values = linkedSignal(() => this.sheetObject().value);
|
|
98
|
+
this.detached = false;
|
|
99
|
+
this.aggregatedProps = {};
|
|
100
|
+
effect(() => {
|
|
101
|
+
this.aggregatedProps = { ...this.aggregatedProps, ...this.props() };
|
|
102
|
+
});
|
|
103
|
+
effect((onCleanup) => {
|
|
104
|
+
const sheetObject = this.sheetObject();
|
|
105
|
+
const cleanup = sheetObject.onValuesChange((newValues) => {
|
|
106
|
+
this.values.set(newValues);
|
|
107
|
+
this.store.snapshot.invalidate();
|
|
108
|
+
});
|
|
109
|
+
onCleanup(cleanup);
|
|
110
|
+
});
|
|
111
|
+
effect((onCleanup) => {
|
|
112
|
+
const studio = this.studio?.();
|
|
113
|
+
if (!studio)
|
|
114
|
+
return;
|
|
115
|
+
const sheetObject = this.sheetObject();
|
|
116
|
+
const cleanup = studio.onSelectionChange((selection) => {
|
|
117
|
+
this.selected.set(selection.includes(sheetObject));
|
|
118
|
+
});
|
|
119
|
+
onCleanup(cleanup);
|
|
120
|
+
});
|
|
121
|
+
effect((onCleanup) => {
|
|
122
|
+
const view = this.vcr.createEmbeddedView(this.templateRef, {
|
|
123
|
+
select: this.select.bind(this),
|
|
124
|
+
deselect: this.deselect.bind(this),
|
|
125
|
+
sheetObject: this.sheetObject.asReadonly(),
|
|
126
|
+
values: this.values.asReadonly(),
|
|
127
|
+
});
|
|
128
|
+
view.detectChanges();
|
|
129
|
+
onCleanup(() => {
|
|
130
|
+
view.destroy();
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
inject(DestroyRef).onDestroy(() => {
|
|
134
|
+
if (this.detach()) {
|
|
135
|
+
this.detached = true;
|
|
136
|
+
this.sheet.sheet().detachObject(this.key());
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
update() {
|
|
141
|
+
if (this.detached)
|
|
142
|
+
return;
|
|
143
|
+
const [sheet, key] = [untracked(this.sheet.sheet), untracked(this.key)];
|
|
144
|
+
sheet.detachObject(key);
|
|
145
|
+
this.sheetObject.set(sheet.object(key, this.aggregatedProps, { reconfigure: true }));
|
|
146
|
+
}
|
|
147
|
+
addProps(props) {
|
|
148
|
+
this.aggregatedProps = { ...this.aggregatedProps, ...props };
|
|
149
|
+
this.update();
|
|
150
|
+
}
|
|
151
|
+
removeProps(props) {
|
|
152
|
+
const [detach, sheet, key] = [untracked(this.detach), untracked(this.sheet.sheet), untracked(this.key)];
|
|
153
|
+
// remove props from sheet object
|
|
154
|
+
props.forEach((prop) => {
|
|
155
|
+
delete this.aggregatedProps[prop];
|
|
156
|
+
});
|
|
157
|
+
// if there are no more props, detach sheet object
|
|
158
|
+
if (Object.keys(this.aggregatedProps).length === 0) {
|
|
159
|
+
// detach sheet object
|
|
160
|
+
if (detach) {
|
|
161
|
+
sheet.detachObject(key);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
// update sheet object (reconfigure)
|
|
166
|
+
this.update();
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
select() {
|
|
170
|
+
const studio = this.studio?.();
|
|
171
|
+
if (!studio)
|
|
172
|
+
return;
|
|
173
|
+
studio.setSelection([this.sheetObject()]);
|
|
174
|
+
}
|
|
175
|
+
deselect() {
|
|
176
|
+
const studio = this.studio?.();
|
|
177
|
+
if (!studio)
|
|
178
|
+
return;
|
|
179
|
+
if (studio.selection.includes(this.sheetObject())) {
|
|
180
|
+
studio.setSelection([]);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
static ngTemplateContextGuard(_, ctx) {
|
|
184
|
+
return true;
|
|
185
|
+
}
|
|
186
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: TheatreSheetObject, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
187
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.2.1", type: TheatreSheetObject, isStandalone: true, selector: "ng-template[sheetObject]", inputs: { key: { classPropertyName: "key", publicName: "sheetObject", isSignal: true, isRequired: true, transformFunction: null }, props: { classPropertyName: "props", publicName: "sheetObjectProps", isSignal: true, isRequired: false, transformFunction: null }, detach: { classPropertyName: "detach", publicName: "sheetObjectDetach", isSignal: true, isRequired: false, transformFunction: null }, selected: { classPropertyName: "selected", publicName: "sheetObjectSelected", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selected: "sheetObjectSelectedChange" }, exportAs: ["sheetObject"], ngImport: i0 }); }
|
|
188
|
+
};
|
|
189
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: TheatreSheetObject$1, decorators: [{
|
|
190
|
+
type: Directive,
|
|
191
|
+
args: [{ selector: 'ng-template[sheetObject]', exportAs: 'sheetObject' }]
|
|
192
|
+
}], ctorParameters: () => [] });
|
|
193
|
+
|
|
194
|
+
function createTransformer(transformer) {
|
|
195
|
+
return transformer;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
const _color = new THREE.Color();
|
|
199
|
+
const color = createTransformer({
|
|
200
|
+
transform(value) {
|
|
201
|
+
value.getRGB(_color, THREE.SRGBColorSpace);
|
|
202
|
+
return types.rgba({ r: _color.r, g: _color.g, b: _color.b, a: 1 });
|
|
203
|
+
},
|
|
204
|
+
apply(target, path, value) {
|
|
205
|
+
target[path].setRGB(value.r, value.g, value.b, THREE.SRGBColorSpace);
|
|
206
|
+
},
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
const degrees = createTransformer({
|
|
210
|
+
transform(target) {
|
|
211
|
+
return types.number(target * THREE.MathUtils.RAD2DEG);
|
|
212
|
+
},
|
|
213
|
+
apply(target, path, value) {
|
|
214
|
+
target[path] = value * THREE.MathUtils.DEG2RAD;
|
|
215
|
+
},
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
const euler = createTransformer({
|
|
219
|
+
transform(value) {
|
|
220
|
+
return types.compound({
|
|
221
|
+
x: value.x * THREE.MathUtils.RAD2DEG,
|
|
222
|
+
y: value.y * THREE.MathUtils.RAD2DEG,
|
|
223
|
+
z: value.z * THREE.MathUtils.RAD2DEG,
|
|
224
|
+
});
|
|
225
|
+
},
|
|
226
|
+
apply(target, path, value) {
|
|
227
|
+
target[path].x = value.x * THREE.MathUtils.DEG2RAD;
|
|
228
|
+
target[path].y = value.y * THREE.MathUtils.DEG2RAD;
|
|
229
|
+
target[path].z = value.z * THREE.MathUtils.DEG2RAD;
|
|
230
|
+
},
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
const generic = createTransformer({
|
|
234
|
+
transform(value) {
|
|
235
|
+
if (typeof value === 'number') {
|
|
236
|
+
return types.number(value === Infinity ? Number.MAX_VALUE : value);
|
|
237
|
+
}
|
|
238
|
+
else if (typeof value === 'string') {
|
|
239
|
+
return types.string(value);
|
|
240
|
+
}
|
|
241
|
+
else if (typeof value === 'boolean') {
|
|
242
|
+
return types.boolean(value);
|
|
243
|
+
}
|
|
244
|
+
return types.compound({ ...value });
|
|
245
|
+
},
|
|
246
|
+
apply(target, path, value) {
|
|
247
|
+
if (target[path] !== null && typeof target[path] === 'object') {
|
|
248
|
+
Object.assign(target[path], value);
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
target[path] = value;
|
|
252
|
+
}
|
|
253
|
+
},
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
const normalized = createTransformer({
|
|
257
|
+
transform(value) {
|
|
258
|
+
return types.number(value, { range: [0, 1] });
|
|
259
|
+
},
|
|
260
|
+
apply(target, path, value) {
|
|
261
|
+
target[path] = value;
|
|
262
|
+
},
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
const side = createTransformer({
|
|
266
|
+
transform(value) {
|
|
267
|
+
// TODO: fix this type
|
|
268
|
+
return types.stringLiteral(value === THREE.FrontSide ? 'f' : value === THREE.BackSide ? 'b' : 'd', { f: 'Front', b: 'Back', d: 'Double' }, { as: 'switch' });
|
|
269
|
+
},
|
|
270
|
+
apply(target, path, value) {
|
|
271
|
+
target[path] = value === 'f' ? THREE.FrontSide : value === 'b' ? THREE.BackSide : THREE.DoubleSide;
|
|
272
|
+
},
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
function isFullOrEndingPattern(fullPropertyPath, pattern) {
|
|
276
|
+
return fullPropertyPath.endsWith(`.${pattern}`) || fullPropertyPath === pattern;
|
|
277
|
+
}
|
|
278
|
+
function getDefaultTransformer(target, path, fullPropertyPath) {
|
|
279
|
+
const property = target[path];
|
|
280
|
+
if (property.isEuler)
|
|
281
|
+
return euler;
|
|
282
|
+
if (property.isColor)
|
|
283
|
+
return color;
|
|
284
|
+
if (isFullOrEndingPattern(fullPropertyPath, 'rotation.x') ||
|
|
285
|
+
isFullOrEndingPattern(fullPropertyPath, 'rotation.y') ||
|
|
286
|
+
isFullOrEndingPattern(fullPropertyPath, 'rotation.z') ||
|
|
287
|
+
(target.isEuler && (fullPropertyPath === 'x' || fullPropertyPath === 'y' || fullPropertyPath === 'z'))) {
|
|
288
|
+
return degrees;
|
|
289
|
+
}
|
|
290
|
+
if (isFullOrEndingPattern(fullPropertyPath, 'r'))
|
|
291
|
+
return normalized;
|
|
292
|
+
if (isFullOrEndingPattern(fullPropertyPath, 'g'))
|
|
293
|
+
return normalized;
|
|
294
|
+
if (isFullOrEndingPattern(fullPropertyPath, 'b'))
|
|
295
|
+
return normalized;
|
|
296
|
+
if (isFullOrEndingPattern(fullPropertyPath, 'opacity'))
|
|
297
|
+
return normalized;
|
|
298
|
+
if (isFullOrEndingPattern(fullPropertyPath, 'roughness'))
|
|
299
|
+
return normalized;
|
|
300
|
+
if (isFullOrEndingPattern(fullPropertyPath, 'metalness'))
|
|
301
|
+
return normalized;
|
|
302
|
+
if (isFullOrEndingPattern(fullPropertyPath, 'transmission'))
|
|
303
|
+
return normalized;
|
|
304
|
+
if (isFullOrEndingPattern(fullPropertyPath, 'side'))
|
|
305
|
+
return side;
|
|
306
|
+
return generic;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
const updateProjectionMatrixKeys = ['fov', 'near', 'far', 'zoom', 'left', 'right', 'top', 'bottom', 'aspect'];
|
|
310
|
+
class TheatreSheetObjectSync {
|
|
311
|
+
constructor() {
|
|
312
|
+
this.parent = input.required({
|
|
313
|
+
alias: 'sync',
|
|
314
|
+
});
|
|
315
|
+
this.props = input([], { alias: 'syncProps' });
|
|
316
|
+
this.theatreSheetObject = inject(TheatreSheetObject$1);
|
|
317
|
+
this.sheetObject = computed(() => this.theatreSheetObject.sheetObject());
|
|
318
|
+
this.studio = inject(THEATRE_STUDIO, { optional: true });
|
|
319
|
+
this.parentRef = computed(() => {
|
|
320
|
+
const parent = this.parent();
|
|
321
|
+
if (typeof parent === 'function')
|
|
322
|
+
return resolveRef(parent());
|
|
323
|
+
return resolveRef(parent);
|
|
324
|
+
});
|
|
325
|
+
this.resolvedProps = computed(() => {
|
|
326
|
+
const props = this.props();
|
|
327
|
+
return props.reduce((resolved, prop) => {
|
|
328
|
+
if (typeof prop === 'string') {
|
|
329
|
+
resolved.push([prop, { key: this.resolvePropertyPath(prop) }]);
|
|
330
|
+
}
|
|
331
|
+
else {
|
|
332
|
+
if (typeof prop[1] === 'string') {
|
|
333
|
+
resolved.push([prop[0], { key: prop[1] }]);
|
|
334
|
+
}
|
|
335
|
+
else {
|
|
336
|
+
resolved.push(prop);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
return resolved;
|
|
340
|
+
}, []);
|
|
341
|
+
});
|
|
342
|
+
this.propsToAdd = computed(() => {
|
|
343
|
+
const parent = this.parentRef();
|
|
344
|
+
if (!parent)
|
|
345
|
+
return null;
|
|
346
|
+
const propsToAdd = {};
|
|
347
|
+
const resolvedProps = this.resolvedProps();
|
|
348
|
+
resolvedProps.forEach(([propName, { key, label, transformer }]) => {
|
|
349
|
+
const { root, targetKey } = resolveInstanceKey(parent, propName);
|
|
350
|
+
const rawValue = root[targetKey];
|
|
351
|
+
const valueTransformer = transformer ?? getDefaultTransformer(root, targetKey, propName);
|
|
352
|
+
const value = valueTransformer.transform(rawValue);
|
|
353
|
+
value.label = label ?? key;
|
|
354
|
+
this.propsMapping[key] = { path: propName, transformer: valueTransformer };
|
|
355
|
+
propsToAdd[key] = value;
|
|
356
|
+
});
|
|
357
|
+
return propsToAdd;
|
|
358
|
+
});
|
|
359
|
+
this.propsMapping = {};
|
|
360
|
+
effect(() => {
|
|
361
|
+
const propsToAdd = this.propsToAdd();
|
|
362
|
+
if (!propsToAdd)
|
|
363
|
+
return;
|
|
364
|
+
this.theatreSheetObject.addProps(propsToAdd);
|
|
365
|
+
});
|
|
366
|
+
effect((onCleanup) => {
|
|
367
|
+
const parent = this.parentRef();
|
|
368
|
+
if (!parent)
|
|
369
|
+
return;
|
|
370
|
+
const propsToAdd = this.propsToAdd();
|
|
371
|
+
if (!propsToAdd)
|
|
372
|
+
return;
|
|
373
|
+
const sheetObject = this.sheetObject();
|
|
374
|
+
const cleanup = sheetObject.onValuesChange((newValues) => {
|
|
375
|
+
Object.keys(newValues).forEach((key) => {
|
|
376
|
+
// first, check if the prop is mapped in this component
|
|
377
|
+
const propMapping = this.propsMapping[key];
|
|
378
|
+
if (!propMapping)
|
|
379
|
+
return;
|
|
380
|
+
// we're using the addedProps map to infer the target property name from the property name on values
|
|
381
|
+
const { root, targetKey } = resolveInstanceKey(parent, propMapping.path);
|
|
382
|
+
// use a transformer to apply value
|
|
383
|
+
const transformer = propMapping.transformer;
|
|
384
|
+
transformer.apply(root, targetKey, newValues[key]);
|
|
385
|
+
if (updateProjectionMatrixKeys.includes(targetKey)) {
|
|
386
|
+
root.updateProjectionMatrix?.();
|
|
387
|
+
}
|
|
388
|
+
});
|
|
389
|
+
});
|
|
390
|
+
onCleanup(cleanup);
|
|
391
|
+
});
|
|
392
|
+
inject(DestroyRef).onDestroy(() => {
|
|
393
|
+
this.theatreSheetObject.removeProps(Object.keys(this.propsMapping));
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
capture() {
|
|
397
|
+
const studio = this.studio?.();
|
|
398
|
+
if (!studio)
|
|
399
|
+
return;
|
|
400
|
+
const parent = this.parentRef();
|
|
401
|
+
if (!parent)
|
|
402
|
+
return;
|
|
403
|
+
const sheetObject = this.sheetObject();
|
|
404
|
+
if (!sheetObject)
|
|
405
|
+
return;
|
|
406
|
+
const scrub = studio.scrub();
|
|
407
|
+
Object.keys(sheetObject.value).forEach((key) => {
|
|
408
|
+
// first, check if the prop is mapped in this component
|
|
409
|
+
const propMapping = this.propsMapping[key];
|
|
410
|
+
if (!propMapping)
|
|
411
|
+
return;
|
|
412
|
+
// we're using the addedProps map to infer the target property name from the property name on values
|
|
413
|
+
const { targetProp } = resolveInstanceKey(parent, propMapping.path);
|
|
414
|
+
const value = propMapping.transformer.transform(targetProp).default;
|
|
415
|
+
scrub.capture(({ set }) => {
|
|
416
|
+
set(sheetObject.props[key], value);
|
|
417
|
+
});
|
|
418
|
+
});
|
|
419
|
+
scrub.commit();
|
|
420
|
+
}
|
|
421
|
+
resolvePropertyPath(propPath) {
|
|
422
|
+
return (propPath
|
|
423
|
+
// make the label alphanumeric by first removing dots (fundamental feature for pierced props)
|
|
424
|
+
.replace(/\./g, '-')
|
|
425
|
+
// make the following characters uppercase
|
|
426
|
+
.replace(/-([a-z])/g, (g) => g[1].toUpperCase())
|
|
427
|
+
// convert to safe alphanumeric characters without dashes
|
|
428
|
+
.replace(/[^a-zA-Z0-9]/g, ''));
|
|
429
|
+
}
|
|
430
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: TheatreSheetObjectSync, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
431
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.2.1", type: TheatreSheetObjectSync, isStandalone: true, selector: "[sync]", inputs: { parent: { classPropertyName: "parent", publicName: "sync", isSignal: true, isRequired: true, transformFunction: null }, props: { classPropertyName: "props", publicName: "syncProps", isSignal: true, isRequired: false, transformFunction: null } }, exportAs: ["sync"], ngImport: i0 }); }
|
|
432
|
+
}
|
|
433
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: TheatreSheetObjectSync, decorators: [{
|
|
434
|
+
type: Directive,
|
|
435
|
+
args: [{ selector: '[sync]', exportAs: 'sync' }]
|
|
436
|
+
}], ctorParameters: () => [] });
|
|
437
|
+
|
|
438
|
+
class TheatreSheetObjectTransform {
|
|
439
|
+
onMouseDown() {
|
|
440
|
+
if (!this.studio)
|
|
441
|
+
return;
|
|
442
|
+
if (this.scrub)
|
|
443
|
+
return;
|
|
444
|
+
this.scrub = this.studio().scrub();
|
|
445
|
+
}
|
|
446
|
+
onMouseUp() {
|
|
447
|
+
if (!this.scrub)
|
|
448
|
+
return;
|
|
449
|
+
this.scrub.commit();
|
|
450
|
+
this.scrub = undefined;
|
|
451
|
+
}
|
|
452
|
+
onChange() {
|
|
453
|
+
if (!this.scrub)
|
|
454
|
+
return;
|
|
455
|
+
this.scrub.capture((api) => {
|
|
456
|
+
const sheetObject = this.sheetObject();
|
|
457
|
+
if (!sheetObject)
|
|
458
|
+
return;
|
|
459
|
+
const group = this.groupRef().nativeElement;
|
|
460
|
+
const key = this.key();
|
|
461
|
+
const baseTarget = key ? sheetObject.props[key] : sheetObject.props;
|
|
462
|
+
api.set(baseTarget['position'], { ...group.position });
|
|
463
|
+
api.set(baseTarget['rotation'], {
|
|
464
|
+
x: group.rotation.x * THREE.MathUtils.RAD2DEG,
|
|
465
|
+
y: group.rotation.y * THREE.MathUtils.RAD2DEG,
|
|
466
|
+
z: group.rotation.z * THREE.MathUtils.RAD2DEG,
|
|
467
|
+
});
|
|
468
|
+
api.set(baseTarget['scale'], { ...group.scale });
|
|
469
|
+
});
|
|
470
|
+
}
|
|
471
|
+
constructor() {
|
|
472
|
+
this.label = input();
|
|
473
|
+
this.key = input();
|
|
474
|
+
this.options = input({});
|
|
475
|
+
this.groupRef = viewChild.required('group');
|
|
476
|
+
this.controlsRef = viewChild(NgtsTransformControls);
|
|
477
|
+
this.theatreSheetObject = inject(TheatreSheetObject$1);
|
|
478
|
+
this.sheetObject = computed(() => this.theatreSheetObject.sheetObject());
|
|
479
|
+
this.studio = inject(THEATRE_STUDIO, { optional: true });
|
|
480
|
+
this.selected = this.theatreSheetObject.selected.asReadonly();
|
|
481
|
+
this.positionTransformer = computed(() => getDefaultTransformer(this.groupRef().nativeElement, 'position', 'position'));
|
|
482
|
+
this.rotationTransformer = computed(() => getDefaultTransformer(this.groupRef().nativeElement, 'rotation', 'rotation'));
|
|
483
|
+
this.scaleTransformer = computed(() => getDefaultTransformer(this.groupRef().nativeElement, 'scale', 'scale'));
|
|
484
|
+
extend({ Group });
|
|
485
|
+
afterNextRender(() => {
|
|
486
|
+
this.init();
|
|
487
|
+
});
|
|
488
|
+
effect((onCleanup) => {
|
|
489
|
+
const [sheetObject, key, positionTransformer, rotationTransformer, scaleTransformer, group] = [
|
|
490
|
+
this.sheetObject(),
|
|
491
|
+
untracked(this.key),
|
|
492
|
+
untracked(this.positionTransformer),
|
|
493
|
+
untracked(this.rotationTransformer),
|
|
494
|
+
untracked(this.scaleTransformer),
|
|
495
|
+
untracked(this.groupRef).nativeElement,
|
|
496
|
+
];
|
|
497
|
+
const cleanup = sheetObject.onValuesChange((newValues) => {
|
|
498
|
+
let object = newValues;
|
|
499
|
+
if (key) {
|
|
500
|
+
if (!newValues[key])
|
|
501
|
+
return;
|
|
502
|
+
object = newValues[key];
|
|
503
|
+
}
|
|
504
|
+
else {
|
|
505
|
+
if (!newValues['position'] || !newValues['rotation'] || !newValues['scale'])
|
|
506
|
+
return;
|
|
507
|
+
}
|
|
508
|
+
// sanity check
|
|
509
|
+
if (!object)
|
|
510
|
+
return;
|
|
511
|
+
positionTransformer.apply(group, 'position', object['position']);
|
|
512
|
+
rotationTransformer.apply(group, 'rotation', object['rotation']);
|
|
513
|
+
scaleTransformer.apply(group, 'scale', object['scale']);
|
|
514
|
+
});
|
|
515
|
+
onCleanup(cleanup);
|
|
516
|
+
});
|
|
517
|
+
// TODO: (chau) use event binding when they no longer trigger change detection
|
|
518
|
+
effect((onCleanup) => {
|
|
519
|
+
const controls = this.controlsRef();
|
|
520
|
+
if (!controls)
|
|
521
|
+
return;
|
|
522
|
+
const subs = [
|
|
523
|
+
controls.change.subscribe(this.onChange.bind(this)),
|
|
524
|
+
controls.mouseDown.subscribe(this.onMouseDown.bind(this)),
|
|
525
|
+
controls.mouseUp.subscribe(this.onMouseUp.bind(this)),
|
|
526
|
+
];
|
|
527
|
+
onCleanup(() => {
|
|
528
|
+
subs.forEach((sub) => sub.unsubscribe());
|
|
529
|
+
});
|
|
530
|
+
});
|
|
531
|
+
inject(DestroyRef).onDestroy(() => {
|
|
532
|
+
const key = this.key();
|
|
533
|
+
this.theatreSheetObject.removeProps(key ? [key] : ['position', 'rotation', 'scale']);
|
|
534
|
+
});
|
|
535
|
+
}
|
|
536
|
+
init() {
|
|
537
|
+
const [group, key, label, positionTransformer, rotationTransformer, scaleTransformer] = [
|
|
538
|
+
this.groupRef().nativeElement,
|
|
539
|
+
this.key(),
|
|
540
|
+
this.label(),
|
|
541
|
+
this.positionTransformer(),
|
|
542
|
+
this.rotationTransformer(),
|
|
543
|
+
this.scaleTransformer(),
|
|
544
|
+
];
|
|
545
|
+
const position = positionTransformer.transform(group.position);
|
|
546
|
+
const rotation = rotationTransformer.transform(group.rotation);
|
|
547
|
+
const scale = scaleTransformer.transform(group.scale);
|
|
548
|
+
if (key) {
|
|
549
|
+
this.theatreSheetObject.addProps({
|
|
550
|
+
[key]: types.compound({ position, rotation, scale }, { label: label ?? key }),
|
|
551
|
+
});
|
|
552
|
+
}
|
|
553
|
+
else {
|
|
554
|
+
this.theatreSheetObject.addProps({ position, rotation, scale });
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: TheatreSheetObjectTransform, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
558
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.1", type: TheatreSheetObjectTransform, isStandalone: true, selector: "theatre-transform", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, key: { classPropertyName: "key", publicName: "key", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "groupRef", first: true, predicate: ["group"], descendants: true, isSignal: true }, { propertyName: "controlsRef", first: true, predicate: NgtsTransformControls, descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
559
|
+
@if (selected()) {
|
|
560
|
+
<ngts-transform-controls [object]="$any(group)" [options]="options()" />
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
<ngt-group #group>
|
|
564
|
+
<ng-content />
|
|
565
|
+
</ngt-group>
|
|
566
|
+
`, isInline: true, dependencies: [{ kind: "component", type: NgtsTransformControls, selector: "ngts-transform-controls", inputs: ["object", "options"], outputs: ["change", "mouseDown", "mouseUp", "objectChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
567
|
+
}
|
|
568
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: TheatreSheetObjectTransform, decorators: [{
|
|
569
|
+
type: Component,
|
|
570
|
+
args: [{
|
|
571
|
+
selector: 'theatre-transform',
|
|
572
|
+
template: `
|
|
573
|
+
@if (selected()) {
|
|
574
|
+
<ngts-transform-controls [object]="$any(group)" [options]="options()" />
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
<ngt-group #group>
|
|
578
|
+
<ng-content />
|
|
579
|
+
</ngt-group>
|
|
580
|
+
`,
|
|
581
|
+
imports: [NgtsTransformControls],
|
|
582
|
+
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
583
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
584
|
+
}]
|
|
585
|
+
}], ctorParameters: () => [] });
|
|
586
|
+
|
|
587
|
+
const TheatreSheetObject = [TheatreSheetObject$1, TheatreSheetObjectTransform, TheatreSheetObjectSync];
|
|
588
|
+
|
|
589
|
+
class TheatreStudio {
|
|
590
|
+
constructor() {
|
|
591
|
+
this.enabled = input(true, { alias: 'studio', transform: booleanAttribute });
|
|
592
|
+
this.Studio = signal(null);
|
|
593
|
+
this.studio = this.Studio.asReadonly();
|
|
594
|
+
import('@theatre/studio').then((m) => {
|
|
595
|
+
const Studio = 'default' in m.default ? m.default.default : m.default;
|
|
596
|
+
Studio.initialize();
|
|
597
|
+
this.Studio.set(Studio);
|
|
598
|
+
});
|
|
599
|
+
effect((onCleanup) => {
|
|
600
|
+
const studio = this.Studio();
|
|
601
|
+
if (!studio)
|
|
602
|
+
return;
|
|
603
|
+
const enabled = this.enabled();
|
|
604
|
+
if (enabled) {
|
|
605
|
+
studio.ui.restore();
|
|
606
|
+
}
|
|
607
|
+
else {
|
|
608
|
+
studio.ui.hide();
|
|
609
|
+
}
|
|
610
|
+
onCleanup(() => {
|
|
611
|
+
studio.ui.hide();
|
|
612
|
+
});
|
|
613
|
+
});
|
|
614
|
+
}
|
|
615
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: TheatreStudio, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
616
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.2.1", type: TheatreStudio, isStandalone: true, selector: "theatre-project[studio]", inputs: { enabled: { classPropertyName: "enabled", publicName: "studio", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
|
|
617
|
+
{ provide: THEATRE_STUDIO, useFactory: (studio) => studio.studio, deps: [TheatreStudio] },
|
|
618
|
+
], exportAs: ["studio"], ngImport: i0 }); }
|
|
619
|
+
}
|
|
620
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: TheatreStudio, decorators: [{
|
|
621
|
+
type: Directive,
|
|
622
|
+
args: [{
|
|
623
|
+
selector: 'theatre-project[studio]',
|
|
624
|
+
exportAs: 'studio',
|
|
625
|
+
providers: [
|
|
626
|
+
{ provide: THEATRE_STUDIO, useFactory: (studio) => studio.studio, deps: [TheatreStudio] },
|
|
627
|
+
],
|
|
628
|
+
}]
|
|
629
|
+
}], ctorParameters: () => [] });
|
|
630
|
+
|
|
631
|
+
const defaultOptions = {
|
|
632
|
+
rate: 1,
|
|
633
|
+
autoplay: false,
|
|
634
|
+
autopause: false,
|
|
635
|
+
delay: 0,
|
|
636
|
+
};
|
|
637
|
+
class TheatreSequence {
|
|
638
|
+
constructor() {
|
|
639
|
+
this.options = input(defaultOptions, { alias: 'sequence', transform: mergeInputs(defaultOptions) });
|
|
640
|
+
this.audioOptions = input(undefined, { alias: 'sequenceAudio' });
|
|
641
|
+
this.position = model(0);
|
|
642
|
+
this.playing = model(false);
|
|
643
|
+
this.length = model(0);
|
|
644
|
+
this.playOptions = omit(this.options, ['autoplay', 'autopause', 'delay', 'autoreset']);
|
|
645
|
+
this.autoplay = pick(this.options, 'autoplay');
|
|
646
|
+
this.autopause = pick(this.options, 'autopause');
|
|
647
|
+
this.autoreset = pick(this.options, 'autoreset');
|
|
648
|
+
this.delay = pick(this.options, 'delay');
|
|
649
|
+
this.project = inject(TheatreProject);
|
|
650
|
+
this.sheet = inject(TheatreSheet$1, { host: true });
|
|
651
|
+
this.sequence = computed(() => this.sheet.sheet().sequence);
|
|
652
|
+
effect((onCleanup) => {
|
|
653
|
+
const autoplay = untracked(this.autoplay);
|
|
654
|
+
if (!autoplay)
|
|
655
|
+
return;
|
|
656
|
+
const delay = untracked(this.delay);
|
|
657
|
+
const id = setTimeout(() => {
|
|
658
|
+
untracked(() => this.play());
|
|
659
|
+
}, delay);
|
|
660
|
+
onCleanup(() => {
|
|
661
|
+
clearTimeout(id);
|
|
662
|
+
});
|
|
663
|
+
});
|
|
664
|
+
effect((onCleanup) => {
|
|
665
|
+
const autopause = untracked(this.autopause);
|
|
666
|
+
onCleanup(() => {
|
|
667
|
+
if (autopause) {
|
|
668
|
+
this.pause();
|
|
669
|
+
}
|
|
670
|
+
});
|
|
671
|
+
});
|
|
672
|
+
effect((onCleanup) => {
|
|
673
|
+
const autoreset = untracked(this.autoreset);
|
|
674
|
+
if (autoreset === 'init' || autoreset === 'always') {
|
|
675
|
+
untracked(() => this.reset());
|
|
676
|
+
}
|
|
677
|
+
onCleanup(() => {
|
|
678
|
+
if (autoreset === 'destroy' || autoreset === 'always') {
|
|
679
|
+
untracked(() => this.reset());
|
|
680
|
+
}
|
|
681
|
+
});
|
|
682
|
+
});
|
|
683
|
+
effect(() => {
|
|
684
|
+
const [audioOptions, sequence] = [this.audioOptions(), untracked(this.sequence)];
|
|
685
|
+
if (audioOptions)
|
|
686
|
+
sequence.attachAudio(audioOptions);
|
|
687
|
+
});
|
|
688
|
+
effect(() => {
|
|
689
|
+
const [playOptions, sequence] = [this.playOptions(), untracked(this.sequence)];
|
|
690
|
+
const isPlaying = val(sequence.pointer.playing);
|
|
691
|
+
if (isPlaying) {
|
|
692
|
+
this.pause();
|
|
693
|
+
this.play(playOptions);
|
|
694
|
+
}
|
|
695
|
+
});
|
|
696
|
+
effect((onCleanup) => {
|
|
697
|
+
const sequence = this.sequence();
|
|
698
|
+
const cleanups = [];
|
|
699
|
+
cleanups.push(onChange(sequence.pointer.position, (value) => this.position.set(value)), onChange(sequence.pointer.playing, (value) => this.playing.set(value)), onChange(sequence.pointer.length, (value) => this.length.set(value)));
|
|
700
|
+
onCleanup(() => {
|
|
701
|
+
cleanups.forEach((cleanup) => cleanup());
|
|
702
|
+
});
|
|
703
|
+
});
|
|
704
|
+
}
|
|
705
|
+
pause() {
|
|
706
|
+
const sequence = this.sequence();
|
|
707
|
+
sequence.pause();
|
|
708
|
+
}
|
|
709
|
+
play(options = {}) {
|
|
710
|
+
const sequence = this.sequence();
|
|
711
|
+
const project = this.project.project();
|
|
712
|
+
project.ready.then(() => {
|
|
713
|
+
sequence.play({ ...this.playOptions(), ...options });
|
|
714
|
+
});
|
|
715
|
+
}
|
|
716
|
+
reset() {
|
|
717
|
+
const sequence = this.sequence();
|
|
718
|
+
const isPlaying = val(sequence.pointer.playing);
|
|
719
|
+
sequence.position = 0;
|
|
720
|
+
if (isPlaying)
|
|
721
|
+
this.play();
|
|
722
|
+
}
|
|
723
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: TheatreSequence, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
724
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.2.1", type: TheatreSequence, isStandalone: true, selector: "[sheet][sequence]", inputs: { options: { classPropertyName: "options", publicName: "sequence", isSignal: true, isRequired: false, transformFunction: null }, audioOptions: { classPropertyName: "audioOptions", publicName: "sequenceAudio", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, playing: { classPropertyName: "playing", publicName: "playing", isSignal: true, isRequired: false, transformFunction: null }, length: { classPropertyName: "length", publicName: "length", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { position: "positionChange", playing: "playingChange", length: "lengthChange" }, exportAs: ["sequence"], ngImport: i0 }); }
|
|
725
|
+
}
|
|
726
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: TheatreSequence, decorators: [{
|
|
727
|
+
type: Directive,
|
|
728
|
+
args: [{ selector: '[sheet][sequence]', exportAs: 'sequence' }]
|
|
729
|
+
}], ctorParameters: () => [] });
|
|
730
|
+
|
|
731
|
+
const TheatreSheet = [TheatreSheet$1, TheatreSequence];
|
|
732
|
+
|
|
733
|
+
/**
|
|
734
|
+
* Generated bundle index. Do not edit.
|
|
735
|
+
*/
|
|
736
|
+
|
|
737
|
+
export { TheatreProject, TheatreSequence, TheatreSheet, TheatreSheet$1 as TheatreSheetImpl, TheatreSheetObject, TheatreSheetObject$1 as TheatreSheetObjectImpl, TheatreSheetObjectSync, TheatreSheetObjectTransform, TheatreStudio };
|
|
738
|
+
//# sourceMappingURL=angular-three-theatre.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"angular-three-theatre.mjs","sources":["../../../../libs/theatre/src/lib/project.ts","../../../../libs/theatre/src/lib/sheet.ts","../../../../libs/theatre/src/lib/studio/studio-token.ts","../../../../libs/theatre/src/lib/sheet-object/sheet-object.ts","../../../../libs/theatre/src/lib/transformers/transformer.ts","../../../../libs/theatre/src/lib/transformers/color.ts","../../../../libs/theatre/src/lib/transformers/degrees.ts","../../../../libs/theatre/src/lib/transformers/euler.ts","../../../../libs/theatre/src/lib/transformers/generic.ts","../../../../libs/theatre/src/lib/transformers/normalized.ts","../../../../libs/theatre/src/lib/transformers/side.ts","../../../../libs/theatre/src/lib/transformers/default-transformer.ts","../../../../libs/theatre/src/lib/sheet-object/sync.ts","../../../../libs/theatre/src/lib/sheet-object/transform.ts","../../../../libs/theatre/src/lib/sheet-object/index.ts","../../../../libs/theatre/src/lib/studio/studio.ts","../../../../libs/theatre/src/lib/sequence.ts","../../../../libs/theatre/src/index.ts","../../../../libs/theatre/src/angular-three-theatre.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, effect, input } from '@angular/core';\nimport { getProject, type IProjectConfig, type ISheet } from '@theatre/core';\n\n@Component({\n\tselector: 'theatre-project',\n\ttemplate: `\n\t\t<ng-content />\n\t`,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TheatreProject {\n\tname = input('default-theatre-project');\n\tconfig = input<IProjectConfig>({});\n\n\tproject = computed(() => getProject(this.name(), this.config()));\n\tsheets: Record<string, [sheet: ISheet, count: number]> = {};\n\n\tconstructor() {\n\t\teffect(() => {\n\t\t\tconst project = this.project();\n\t\t\tproject.ready.then();\n\t\t});\n\t}\n}\n","import { computed, DestroyRef, Directive, inject, input } from '@angular/core';\nimport { TheatreProject } from './project';\n\n@Directive({ selector: '[sheet]', exportAs: 'sheet' })\nexport class TheatreSheet {\n\tname = input('default-theatre-sheet', {\n\t\ttransform: (value: string) => {\n\t\t\tif (value === '') return 'default-theatre-sheet';\n\t\t\treturn value;\n\t\t},\n\t\talias: 'sheet',\n\t});\n\n\tprivate project = inject(TheatreProject);\n\n\tsheet = computed(() => {\n\t\tconst name = this.name();\n\t\tconst existing = this.project.sheets[name] || [];\n\n\t\tif (existing[0]) {\n\t\t\texisting[1]++;\n\t\t\treturn existing[0];\n\t\t}\n\n\t\tconst sheet = this.project.project().sheet(name);\n\t\tthis.project.sheets[name] = [sheet, 1];\n\t\treturn sheet;\n\t});\n\n\tconstructor() {\n\t\tinject(DestroyRef).onDestroy(() => {\n\t\t\tconst existing = this.project.sheets[this.name()];\n\t\t\tif (!existing) return;\n\n\t\t\tif (existing[1] >= 1) {\n\t\t\t\texisting[1]--;\n\t\t\t}\n\n\t\t\tif (existing[1] === 0) {\n\t\t\t\tdelete this.project.sheets[this.name()];\n\t\t\t}\n\t\t});\n\t}\n}\n","import { InjectionToken, Signal } from '@angular/core';\nimport type { IStudio } from '@theatre/studio';\n\nexport const THEATRE_STUDIO = new InjectionToken<Signal<IStudio>>('Theatre Studio');\n","import {\n\tbooleanAttribute,\n\tcomputed,\n\tDestroyRef,\n\tDirective,\n\teffect,\n\tinject,\n\tinput,\n\tlinkedSignal,\n\tmodel,\n\tTemplateRef,\n\tuntracked,\n\tViewContainerRef,\n} from '@angular/core';\nimport { UnknownShorthandCompoundProps } from '@theatre/core';\nimport { injectStore } from 'angular-three';\nimport { TheatreSheet } from '../sheet';\nimport { THEATRE_STUDIO } from '../studio/studio-token';\n\n@Directive({ selector: 'ng-template[sheetObject]', exportAs: 'sheetObject' })\nexport class TheatreSheetObject {\n\tkey = input.required<string>({ alias: 'sheetObject' });\n\tprops = input<UnknownShorthandCompoundProps>({}, { alias: 'sheetObjectProps' });\n\tdetach = input(false, { transform: booleanAttribute, alias: 'sheetObjectDetach' });\n\tselected = model<boolean>(false, { alias: 'sheetObjectSelected' });\n\n\tprivate templateRef = inject(TemplateRef);\n\tprivate vcr = inject(ViewContainerRef);\n\tprivate sheet = inject(TheatreSheet);\n\tprivate studio = inject(THEATRE_STUDIO, { optional: true });\n\tprivate store = injectStore();\n\n\tprivate originalSheetObject = computed(() => {\n\t\tconst sheet = this.sheet.sheet();\n\t\treturn sheet.object(this.key(), untracked(this.props), { reconfigure: true });\n\t});\n\tsheetObject = linkedSignal(this.originalSheetObject);\n\tvalues = linkedSignal(() => this.sheetObject().value);\n\n\tprivate detached = false;\n\tprivate aggregatedProps: UnknownShorthandCompoundProps = {};\n\n\tconstructor() {\n\t\teffect(() => {\n\t\t\tthis.aggregatedProps = { ...this.aggregatedProps, ...this.props() };\n\t\t});\n\n\t\teffect((onCleanup) => {\n\t\t\tconst sheetObject = this.sheetObject();\n\t\t\tconst cleanup = sheetObject.onValuesChange((newValues) => {\n\t\t\t\tthis.values.set(newValues);\n\t\t\t\tthis.store.snapshot.invalidate();\n\t\t\t});\n\t\t\tonCleanup(cleanup);\n\t\t});\n\n\t\teffect((onCleanup) => {\n\t\t\tconst studio = this.studio?.();\n\t\t\tif (!studio) return;\n\n\t\t\tconst sheetObject = this.sheetObject();\n\t\t\tconst cleanup = studio.onSelectionChange((selection) => {\n\t\t\t\tthis.selected.set(selection.includes(sheetObject));\n\t\t\t});\n\t\t\tonCleanup(cleanup);\n\t\t});\n\n\t\teffect((onCleanup) => {\n\t\t\tconst view = this.vcr.createEmbeddedView(this.templateRef, {\n\t\t\t\tselect: this.select.bind(this),\n\t\t\t\tdeselect: this.deselect.bind(this),\n\t\t\t\tsheetObject: this.sheetObject.asReadonly(),\n\t\t\t\tvalues: this.values.asReadonly(),\n\t\t\t});\n\t\t\tview.detectChanges();\n\t\t\tonCleanup(() => {\n\t\t\t\tview.destroy();\n\t\t\t});\n\t\t});\n\n\t\tinject(DestroyRef).onDestroy(() => {\n\t\t\tif (this.detach()) {\n\t\t\t\tthis.detached = true;\n\t\t\t\tthis.sheet.sheet().detachObject(this.key());\n\t\t\t}\n\t\t});\n\t}\n\n\tupdate() {\n\t\tif (this.detached) return;\n\n\t\tconst [sheet, key] = [untracked(this.sheet.sheet), untracked(this.key)];\n\t\tsheet.detachObject(key);\n\t\tthis.sheetObject.set(sheet.object(key, this.aggregatedProps, { reconfigure: true }));\n\t}\n\n\taddProps(props: UnknownShorthandCompoundProps) {\n\t\tthis.aggregatedProps = { ...this.aggregatedProps, ...props };\n\t\tthis.update();\n\t}\n\n\tremoveProps(props: string[]) {\n\t\tconst [detach, sheet, key] = [untracked(this.detach), untracked(this.sheet.sheet), untracked(this.key)];\n\n\t\t// remove props from sheet object\n\t\tprops.forEach((prop) => {\n\t\t\tdelete this.aggregatedProps[prop];\n\t\t});\n\n\t\t// if there are no more props, detach sheet object\n\t\tif (Object.keys(this.aggregatedProps).length === 0) {\n\t\t\t// detach sheet object\n\t\t\tif (detach) {\n\t\t\t\tsheet.detachObject(key);\n\t\t\t}\n\t\t} else {\n\t\t\t// update sheet object (reconfigure)\n\t\t\tthis.update();\n\t\t}\n\t}\n\n\tselect() {\n\t\tconst studio = this.studio?.();\n\t\tif (!studio) return;\n\t\tstudio.setSelection([this.sheetObject()]);\n\t}\n\n\tdeselect() {\n\t\tconst studio = this.studio?.();\n\t\tif (!studio) return;\n\n\t\tif (studio.selection.includes(this.sheetObject())) {\n\t\t\tstudio.setSelection([]);\n\t\t}\n\t}\n\n\tstatic ngTemplateContextGuard(\n\t\t_: TheatreSheetObject,\n\t\tctx: unknown,\n\t): ctx is {\n\t\tselect: TheatreSheetObject['select'];\n\t\tdeselect: TheatreSheetObject['deselect'];\n\t\tsheetObject: ReturnType<TheatreSheetObject['sheetObject']['asReadonly']>;\n\t\tvalues: ReturnType<TheatreSheetObject['values']['asReadonly']>;\n\t} {\n\t\treturn true;\n\t}\n}\n","import type { types } from '@theatre/core';\n\n/**\n https://github.com/threlte/threlte/blob/main/packages/theatre/src/lib/sheetObject/transfomers/types.ts\n */\nexport type TheatreTransformer<Value = any, TransformedValue = any> = {\n\t/**\n\t * The `transform` function is used to transform the value of a certain\n\t * Three.js objects proerty to a property that Theatre.js can use in an\n\t * `ISheetObject`. To ensure compatibility with the rest of the package, the\n\t * return value must be any one of the functions available at Theatre.js'\n\t * `types`.\n\t */\n\ttransform: (value: Value) => ReturnType<(typeof types)[keyof typeof types]>;\n\t/**\n\t * The `apply` function is used to apply the value to the target. `target` is\n\t * the parent object of the property (usually a Three.js object), `path` is\n\t * the name of the property and `value` is the value to apply.\n\t */\n\tapply: (target: any, property: string, value: TransformedValue) => void;\n};\n\nexport function createTransformer(transformer: TheatreTransformer) {\n\treturn transformer;\n}\n","import { types } from '@theatre/core';\nimport * as THREE from 'three';\nimport { createTransformer } from './transformer';\n\nconst _color = new THREE.Color();\n\nexport const color = createTransformer({\n\ttransform(value) {\n\t\tvalue.getRGB(_color, THREE.SRGBColorSpace);\n\t\treturn types.rgba({ r: _color.r, g: _color.g, b: _color.b, a: 1 });\n\t},\n\tapply(target, path, value) {\n\t\ttarget[path].setRGB(value.r, value.g, value.b, THREE.SRGBColorSpace);\n\t},\n});\n","import { types } from '@theatre/core';\nimport * as THREE from 'three';\nimport { createTransformer } from './transformer';\n\nexport const degrees = createTransformer({\n\ttransform(target) {\n\t\treturn types.number(target * THREE.MathUtils.RAD2DEG);\n\t},\n\tapply(target, path, value) {\n\t\ttarget[path] = value * THREE.MathUtils.DEG2RAD;\n\t},\n});\n","import { types } from '@theatre/core';\nimport * as THREE from 'three';\nimport { createTransformer } from './transformer';\n\nexport const euler = createTransformer({\n\ttransform(value) {\n\t\treturn types.compound({\n\t\t\tx: value.x * THREE.MathUtils.RAD2DEG,\n\t\t\ty: value.y * THREE.MathUtils.RAD2DEG,\n\t\t\tz: value.z * THREE.MathUtils.RAD2DEG,\n\t\t});\n\t},\n\tapply(target, path, value) {\n\t\ttarget[path].x = value.x * THREE.MathUtils.DEG2RAD;\n\t\ttarget[path].y = value.y * THREE.MathUtils.DEG2RAD;\n\t\ttarget[path].z = value.z * THREE.MathUtils.DEG2RAD;\n\t},\n});\n","import { types } from '@theatre/core';\nimport { createTransformer } from './transformer';\n\nexport const generic = createTransformer({\n\ttransform(value) {\n\t\tif (typeof value === 'number') {\n\t\t\treturn types.number(value === Infinity ? Number.MAX_VALUE : value);\n\t\t} else if (typeof value === 'string') {\n\t\t\treturn types.string(value);\n\t\t} else if (typeof value === 'boolean') {\n\t\t\treturn types.boolean(value);\n\t\t}\n\t\treturn types.compound({ ...value });\n\t},\n\tapply(target, path, value) {\n\t\tif (target[path] !== null && typeof target[path] === 'object') {\n\t\t\tObject.assign(target[path], value);\n\t\t} else {\n\t\t\ttarget[path] = value;\n\t\t}\n\t},\n});\n","import { types } from '@theatre/core';\nimport { createTransformer } from './transformer';\n\nexport const normalized = createTransformer({\n\ttransform(value) {\n\t\treturn types.number(value, { range: [0, 1] });\n\t},\n\tapply(target, path, value) {\n\t\ttarget[path] = value;\n\t},\n});\n","import { types } from '@theatre/core';\nimport * as THREE from 'three';\nimport { createTransformer } from './transformer';\n\nexport const side = createTransformer({\n\ttransform(value) {\n\t\t// TODO: fix this type\n\t\treturn types.stringLiteral(\n\t\t\tvalue === THREE.FrontSide ? 'f' : value === THREE.BackSide ? 'b' : 'd',\n\t\t\t{ f: 'Front', b: 'Back', d: 'Double' },\n\t\t\t{ as: 'switch' },\n\t\t) as any;\n\t},\n\tapply(target, path, value) {\n\t\ttarget[path] = value === 'f' ? THREE.FrontSide : value === 'b' ? THREE.BackSide : THREE.DoubleSide;\n\t},\n});\n","import { color } from './color';\nimport { degrees } from './degrees';\nimport { euler } from './euler';\nimport { generic } from './generic';\nimport { normalized } from './normalized';\nimport { side } from './side';\n\nfunction isFullOrEndingPattern(fullPropertyPath: string, pattern: string) {\n\treturn fullPropertyPath.endsWith(`.${pattern}`) || fullPropertyPath === pattern;\n}\n\nexport function getDefaultTransformer(target: any, path: string, fullPropertyPath: string) {\n\tconst property = target[path];\n\n\tif (property.isEuler) return euler;\n\tif (property.isColor) return color;\n\n\tif (\n\t\tisFullOrEndingPattern(fullPropertyPath, 'rotation.x') ||\n\t\tisFullOrEndingPattern(fullPropertyPath, 'rotation.y') ||\n\t\tisFullOrEndingPattern(fullPropertyPath, 'rotation.z') ||\n\t\t(target.isEuler && (fullPropertyPath === 'x' || fullPropertyPath === 'y' || fullPropertyPath === 'z'))\n\t) {\n\t\treturn degrees;\n\t}\n\n\tif (isFullOrEndingPattern(fullPropertyPath, 'r')) return normalized;\n\tif (isFullOrEndingPattern(fullPropertyPath, 'g')) return normalized;\n\tif (isFullOrEndingPattern(fullPropertyPath, 'b')) return normalized;\n\n\tif (isFullOrEndingPattern(fullPropertyPath, 'opacity')) return normalized;\n\tif (isFullOrEndingPattern(fullPropertyPath, 'roughness')) return normalized;\n\tif (isFullOrEndingPattern(fullPropertyPath, 'metalness')) return normalized;\n\tif (isFullOrEndingPattern(fullPropertyPath, 'transmission')) return normalized;\n\n\tif (isFullOrEndingPattern(fullPropertyPath, 'side')) return side;\n\n\treturn generic;\n}\n","import { computed, DestroyRef, Directive, effect, ElementRef, inject, input } from '@angular/core';\nimport { NgtAnyRecord, resolveInstanceKey, resolveRef } from 'angular-three';\nimport { THEATRE_STUDIO } from '../studio/studio-token';\nimport { getDefaultTransformer } from '../transformers/default-transformer';\nimport { TheatreTransformer } from '../transformers/transformer';\nimport { TheatreSheetObject } from './sheet-object';\n\nconst updateProjectionMatrixKeys = ['fov', 'near', 'far', 'zoom', 'left', 'right', 'top', 'bottom', 'aspect'];\n\n@Directive({ selector: '[sync]', exportAs: 'sync' })\nexport class TheatreSheetObjectSync<TObject extends object> {\n\tparent = input.required<TObject | ElementRef<TObject> | (() => TObject | ElementRef<TObject> | undefined | null)>({\n\t\talias: 'sync',\n\t});\n\tprops = input<\n\t\tArray<string | [string, string | { label?: string; key?: string; transformer?: TheatreTransformer }]>\n\t>([], { alias: 'syncProps' });\n\n\tprivate theatreSheetObject = inject(TheatreSheetObject);\n\tsheetObject = computed(() => this.theatreSheetObject.sheetObject());\n\tprivate studio = inject(THEATRE_STUDIO, { optional: true });\n\n\tprivate parentRef = computed(() => {\n\t\tconst parent = this.parent();\n\t\tif (typeof parent === 'function') return resolveRef(parent());\n\t\treturn resolveRef(parent);\n\t});\n\tprivate resolvedProps = computed(() => {\n\t\tconst props = this.props();\n\t\treturn props.reduce(\n\t\t\t(resolved, prop) => {\n\t\t\t\tif (typeof prop === 'string') {\n\t\t\t\t\tresolved.push([prop, { key: this.resolvePropertyPath(prop) }]);\n\t\t\t\t} else {\n\t\t\t\t\tif (typeof prop[1] === 'string') {\n\t\t\t\t\t\tresolved.push([prop[0], { key: prop[1] }]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresolved.push(\n\t\t\t\t\t\t\tprop as [string, { label?: string; key: string; transformer?: TheatreTransformer }],\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn resolved;\n\t\t\t},\n\t\t\t[] as Array<[string, { label?: string; key: string; transformer?: TheatreTransformer }]>,\n\t\t);\n\t});\n\n\tprivate propsToAdd = computed(() => {\n\t\tconst parent = this.parentRef();\n\t\tif (!parent) return null;\n\n\t\tconst propsToAdd: NgtAnyRecord = {};\n\t\tconst resolvedProps = this.resolvedProps();\n\t\tresolvedProps.forEach(([propName, { key, label, transformer }]) => {\n\t\t\tconst { root, targetKey } = resolveInstanceKey(parent, propName);\n\t\t\tconst rawValue = root[targetKey];\n\t\t\tconst valueTransformer = transformer ?? getDefaultTransformer(root, targetKey, propName);\n\t\t\tconst value = valueTransformer.transform(rawValue);\n\n\t\t\tvalue.label = label ?? key;\n\n\t\t\tthis.propsMapping[key] = { path: propName, transformer: valueTransformer };\n\t\t\tpropsToAdd[key] = value;\n\t\t});\n\n\t\treturn propsToAdd;\n\t});\n\n\tprivate propsMapping: Record<string, { path: string; transformer: TheatreTransformer }> = {};\n\n\tconstructor() {\n\t\teffect(() => {\n\t\t\tconst propsToAdd = this.propsToAdd();\n\t\t\tif (!propsToAdd) return;\n\t\t\tthis.theatreSheetObject.addProps(propsToAdd);\n\t\t});\n\n\t\teffect((onCleanup) => {\n\t\t\tconst parent = this.parentRef();\n\t\t\tif (!parent) return;\n\n\t\t\tconst propsToAdd = this.propsToAdd();\n\t\t\tif (!propsToAdd) return;\n\n\t\t\tconst sheetObject = this.sheetObject();\n\t\t\tconst cleanup = sheetObject.onValuesChange((newValues) => {\n\t\t\t\tObject.keys(newValues).forEach((key) => {\n\t\t\t\t\t// first, check if the prop is mapped in this component\n\t\t\t\t\tconst propMapping = this.propsMapping[key];\n\t\t\t\t\tif (!propMapping) return;\n\n\t\t\t\t\t// we're using the addedProps map to infer the target property name from the property name on values\n\t\t\t\t\tconst { root, targetKey } = resolveInstanceKey(parent, propMapping.path);\n\n\t\t\t\t\t// use a transformer to apply value\n\t\t\t\t\tconst transformer = propMapping.transformer;\n\t\t\t\t\ttransformer.apply(root, targetKey, newValues[key]);\n\n\t\t\t\t\tif (updateProjectionMatrixKeys.includes(targetKey)) {\n\t\t\t\t\t\troot.updateProjectionMatrix?.();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tonCleanup(cleanup);\n\t\t});\n\n\t\tinject(DestroyRef).onDestroy(() => {\n\t\t\tthis.theatreSheetObject.removeProps(Object.keys(this.propsMapping));\n\t\t});\n\t}\n\n\tcapture() {\n\t\tconst studio = this.studio?.();\n\t\tif (!studio) return;\n\n\t\tconst parent = this.parentRef();\n\t\tif (!parent) return;\n\n\t\tconst sheetObject = this.sheetObject();\n\t\tif (!sheetObject) return;\n\n\t\tconst scrub = studio.scrub();\n\n\t\tObject.keys(sheetObject.value).forEach((key) => {\n\t\t\t// first, check if the prop is mapped in this component\n\t\t\tconst propMapping = this.propsMapping[key];\n\t\t\tif (!propMapping) return;\n\n\t\t\t// we're using the addedProps map to infer the target property name from the property name on values\n\t\t\tconst { targetProp } = resolveInstanceKey(parent, propMapping.path);\n\t\t\tconst value = propMapping.transformer.transform(targetProp).default;\n\n\t\t\tscrub.capture(({ set }) => {\n\t\t\t\tset(sheetObject.props[key], value);\n\t\t\t});\n\t\t});\n\n\t\tscrub.commit();\n\t}\n\n\tprivate resolvePropertyPath(propPath: string) {\n\t\treturn (\n\t\t\tpropPath\n\t\t\t\t// make the label alphanumeric by first removing dots (fundamental feature for pierced props)\n\t\t\t\t.replace(/\\./g, '-')\n\t\t\t\t// make the following characters uppercase\n\t\t\t\t.replace(/-([a-z])/g, (g) => g[1].toUpperCase())\n\t\t\t\t// convert to safe alphanumeric characters without dashes\n\t\t\t\t.replace(/[^a-zA-Z0-9]/g, '')\n\t\t);\n\t}\n}\n","import {\n\tafterNextRender,\n\tChangeDetectionStrategy,\n\tComponent,\n\tcomputed,\n\tCUSTOM_ELEMENTS_SCHEMA,\n\tDestroyRef,\n\teffect,\n\tElementRef,\n\tinject,\n\tinput,\n\tuntracked,\n\tviewChild,\n} from '@angular/core';\nimport { types } from '@theatre/core';\nimport { IScrub } from '@theatre/studio';\nimport { extend } from 'angular-three';\nimport { NgtsTransformControls, NgtsTransformControlsOptions } from 'angular-three-soba/gizmos';\nimport * as THREE from 'three';\nimport { Group } from 'three';\nimport { THEATRE_STUDIO } from '../studio/studio-token';\nimport { getDefaultTransformer } from '../transformers/default-transformer';\nimport { TheatreSheetObject } from './sheet-object';\n\n@Component({\n\tselector: 'theatre-transform',\n\ttemplate: `\n\t\t@if (selected()) {\n\t\t\t<ngts-transform-controls [object]=\"$any(group)\" [options]=\"options()\" />\n\t\t}\n\n\t\t<ngt-group #group>\n\t\t\t<ng-content />\n\t\t</ngt-group>\n\t`,\n\timports: [NgtsTransformControls],\n\tschemas: [CUSTOM_ELEMENTS_SCHEMA],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TheatreSheetObjectTransform<TLabel extends string | undefined> {\n\tlabel = input<TLabel>();\n\tkey = input<string>();\n\toptions = input(\n\t\t{} as Pick<NgtsTransformControlsOptions, 'mode' | 'translationSnap' | 'scaleSnap' | 'rotationSnap' | 'space'>,\n\t);\n\n\tgroupRef = viewChild.required<ElementRef<THREE.Group>>('group');\n\tprivate controlsRef = viewChild(NgtsTransformControls);\n\n\tprivate theatreSheetObject = inject(TheatreSheetObject);\n\tsheetObject = computed(() => this.theatreSheetObject.sheetObject());\n\tprivate studio = inject(THEATRE_STUDIO, { optional: true });\n\n\tprotected selected = this.theatreSheetObject.selected.asReadonly();\n\tprivate scrub?: IScrub;\n\n\tprivate positionTransformer = computed(() =>\n\t\tgetDefaultTransformer(this.groupRef().nativeElement, 'position', 'position'),\n\t);\n\tprivate rotationTransformer = computed(() =>\n\t\tgetDefaultTransformer(this.groupRef().nativeElement, 'rotation', 'rotation'),\n\t);\n\tprivate scaleTransformer = computed(() => getDefaultTransformer(this.groupRef().nativeElement, 'scale', 'scale'));\n\n\tprotected onMouseDown() {\n\t\tif (!this.studio) return;\n\t\tif (this.scrub) return;\n\t\tthis.scrub = this.studio().scrub();\n\t}\n\n\tprotected onMouseUp() {\n\t\tif (!this.scrub) return;\n\t\tthis.scrub.commit();\n\t\tthis.scrub = undefined;\n\t}\n\n\tprotected onChange() {\n\t\tif (!this.scrub) return;\n\n\t\tthis.scrub.capture((api) => {\n\t\t\tconst sheetObject = this.sheetObject();\n\t\t\tif (!sheetObject) return;\n\n\t\t\tconst group = this.groupRef().nativeElement;\n\n\t\t\tconst key = this.key();\n\t\t\tconst baseTarget = key ? sheetObject.props[key] : sheetObject.props;\n\n\t\t\tapi.set(baseTarget['position'], { ...group.position });\n\t\t\tapi.set(baseTarget['rotation'], {\n\t\t\t\tx: group.rotation.x * THREE.MathUtils.RAD2DEG,\n\t\t\t\ty: group.rotation.y * THREE.MathUtils.RAD2DEG,\n\t\t\t\tz: group.rotation.z * THREE.MathUtils.RAD2DEG,\n\t\t\t});\n\t\t\tapi.set(baseTarget['scale'], { ...group.scale });\n\t\t});\n\t}\n\n\tconstructor() {\n\t\textend({ Group });\n\n\t\tafterNextRender(() => {\n\t\t\tthis.init();\n\t\t});\n\n\t\teffect((onCleanup) => {\n\t\t\tconst [sheetObject, key, positionTransformer, rotationTransformer, scaleTransformer, group] = [\n\t\t\t\tthis.sheetObject(),\n\t\t\t\tuntracked(this.key),\n\t\t\t\tuntracked(this.positionTransformer),\n\t\t\t\tuntracked(this.rotationTransformer),\n\t\t\t\tuntracked(this.scaleTransformer),\n\t\t\t\tuntracked(this.groupRef).nativeElement,\n\t\t\t];\n\n\t\t\tconst cleanup = sheetObject.onValuesChange((newValues) => {\n\t\t\t\tlet object = newValues;\n\n\t\t\t\tif (key) {\n\t\t\t\t\tif (!newValues[key]) return;\n\t\t\t\t\tobject = newValues[key];\n\t\t\t\t} else {\n\t\t\t\t\tif (!newValues['position'] || !newValues['rotation'] || !newValues['scale']) return;\n\t\t\t\t}\n\n\t\t\t\t// sanity check\n\t\t\t\tif (!object) return;\n\n\t\t\t\tpositionTransformer.apply(group, 'position', object['position']);\n\t\t\t\trotationTransformer.apply(group, 'rotation', object['rotation']);\n\t\t\t\tscaleTransformer.apply(group, 'scale', object['scale']);\n\t\t\t});\n\n\t\t\tonCleanup(cleanup);\n\t\t});\n\n\t\t// TODO: (chau) use event binding when they no longer trigger change detection\n\t\teffect((onCleanup) => {\n\t\t\tconst controls = this.controlsRef();\n\t\t\tif (!controls) return;\n\n\t\t\tconst subs = [\n\t\t\t\tcontrols.change.subscribe(this.onChange.bind(this)),\n\t\t\t\tcontrols.mouseDown.subscribe(this.onMouseDown.bind(this)),\n\t\t\t\tcontrols.mouseUp.subscribe(this.onMouseUp.bind(this)),\n\t\t\t];\n\n\t\t\tonCleanup(() => {\n\t\t\t\tsubs.forEach((sub) => sub.unsubscribe());\n\t\t\t});\n\t\t});\n\n\t\tinject(DestroyRef).onDestroy(() => {\n\t\t\tconst key = this.key();\n\t\t\tthis.theatreSheetObject.removeProps(key ? [key] : ['position', 'rotation', 'scale']);\n\t\t});\n\t}\n\n\tprivate init() {\n\t\tconst [group, key, label, positionTransformer, rotationTransformer, scaleTransformer] = [\n\t\t\tthis.groupRef().nativeElement,\n\t\t\tthis.key(),\n\t\t\tthis.label(),\n\t\t\tthis.positionTransformer(),\n\t\t\tthis.rotationTransformer(),\n\t\t\tthis.scaleTransformer(),\n\t\t];\n\n\t\tconst position = positionTransformer.transform(group.position);\n\t\tconst rotation = rotationTransformer.transform(group.rotation);\n\t\tconst scale = scaleTransformer.transform(group.scale);\n\n\t\tif (key) {\n\t\t\tthis.theatreSheetObject.addProps({\n\t\t\t\t[key]: types.compound({ position, rotation, scale }, { label: label ?? key }),\n\t\t\t});\n\t\t} else {\n\t\t\tthis.theatreSheetObject.addProps({ position, rotation, scale });\n\t\t}\n\t}\n}\n","import { TheatreSheetObject as Impl } from './sheet-object';\nimport { TheatreSheetObjectSync } from './sync';\nimport { TheatreSheetObjectTransform } from './transform';\n\nexport { TheatreSheetObject as TheatreSheetObjectImpl } from './sheet-object';\nexport * from './sync';\nexport * from './transform';\n\nexport const TheatreSheetObject = [Impl, TheatreSheetObjectTransform, TheatreSheetObjectSync];\n","import { booleanAttribute, Directive, effect, input, signal } from '@angular/core';\nimport { type IStudio } from '@theatre/studio';\nimport { THEATRE_STUDIO } from './studio-token';\n\n@Directive({\n\tselector: 'theatre-project[studio]',\n\texportAs: 'studio',\n\tproviders: [\n\t\t{ provide: THEATRE_STUDIO, useFactory: (studio: TheatreStudio) => studio.studio, deps: [TheatreStudio] },\n\t],\n})\nexport class TheatreStudio {\n\tenabled = input(true, { alias: 'studio', transform: booleanAttribute });\n\n\tprivate Studio = signal<IStudio | null>(null);\n\tstudio = this.Studio.asReadonly();\n\n\tconstructor() {\n\t\timport('@theatre/studio').then((m) => {\n\t\t\tconst Studio = 'default' in m.default ? (m.default as unknown as { default: IStudio }).default : m.default;\n\t\t\tStudio.initialize();\n\t\t\tthis.Studio.set(Studio);\n\t\t});\n\n\t\teffect((onCleanup) => {\n\t\t\tconst studio = this.Studio();\n\t\t\tif (!studio) return;\n\n\t\t\tconst enabled = this.enabled();\n\n\t\t\tif (enabled) {\n\t\t\t\tstudio.ui.restore();\n\t\t\t} else {\n\t\t\t\tstudio.ui.hide();\n\t\t\t}\n\n\t\t\tonCleanup(() => {\n\t\t\t\tstudio.ui.hide();\n\t\t\t});\n\t\t});\n\t}\n}\n","import { computed, Directive, effect, inject, input, model, untracked } from '@angular/core';\nimport { type ISequence, onChange, val } from '@theatre/core';\nimport { omit, pick } from 'angular-three';\nimport { mergeInputs } from 'ngxtension/inject-inputs';\nimport { TheatreProject } from './project';\nimport { TheatreSheet } from './sheet';\n\nexport interface AttachAudioOptions {\n\t/**\n\t * Either a URL to the audio file (eg \"http://localhost:3000/audio.mp3\") or an instance of AudioBuffer\n\t */\n\tsource: string | AudioBuffer;\n\t/**\n\t * An optional AudioContext. If not provided, one will be created.\n\t */\n\taudioContext?: AudioContext;\n\t/**\n\t * An AudioNode to feed the audio into. Will use audioContext.destination if not provided.\n\t */\n\tdestinationNode?: AudioNode;\n}\n\nexport type TheatreSequenceOptions = Parameters<ISequence['play']>[0] & {\n\tautoplay: boolean;\n\tautopause: boolean;\n\tdelay: number;\n\tautoreset?: 'init' | 'destroy' | 'always';\n};\n\nconst defaultOptions: TheatreSequenceOptions = {\n\trate: 1,\n\tautoplay: false,\n\tautopause: false,\n\tdelay: 0,\n};\n\n@Directive({ selector: '[sheet][sequence]', exportAs: 'sequence' })\nexport class TheatreSequence {\n\toptions = input(defaultOptions, { alias: 'sequence', transform: mergeInputs(defaultOptions) });\n\taudioOptions = input<AttachAudioOptions | undefined>(undefined, { alias: 'sequenceAudio' });\n\n\tposition = model<number>(0);\n\tplaying = model<boolean>(false);\n\tlength = model<number>(0);\n\n\tprivate playOptions = omit(this.options, ['autoplay', 'autopause', 'delay', 'autoreset']);\n\tprivate autoplay = pick(this.options, 'autoplay');\n\tprivate autopause = pick(this.options, 'autopause');\n\tprivate autoreset = pick(this.options, 'autoreset');\n\tprivate delay = pick(this.options, 'delay');\n\n\tprivate project = inject(TheatreProject);\n\tprivate sheet = inject(TheatreSheet, { host: true });\n\tsequence = computed(() => this.sheet.sheet().sequence);\n\n\tconstructor() {\n\t\teffect((onCleanup) => {\n\t\t\tconst autoplay = untracked(this.autoplay);\n\t\t\tif (!autoplay) return;\n\n\t\t\tconst delay = untracked(this.delay);\n\t\t\tconst id = setTimeout(() => {\n\t\t\t\tuntracked(() => this.play());\n\t\t\t}, delay);\n\n\t\t\tonCleanup(() => {\n\t\t\t\tclearTimeout(id);\n\t\t\t});\n\t\t});\n\n\t\teffect((onCleanup) => {\n\t\t\tconst autopause = untracked(this.autopause);\n\t\t\tonCleanup(() => {\n\t\t\t\tif (autopause) {\n\t\t\t\t\tthis.pause();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\teffect((onCleanup) => {\n\t\t\tconst autoreset = untracked(this.autoreset);\n\t\t\tif (autoreset === 'init' || autoreset === 'always') {\n\t\t\t\tuntracked(() => this.reset());\n\t\t\t}\n\n\t\t\tonCleanup(() => {\n\t\t\t\tif (autoreset === 'destroy' || autoreset === 'always') {\n\t\t\t\t\tuntracked(() => this.reset());\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\teffect(() => {\n\t\t\tconst [audioOptions, sequence] = [this.audioOptions(), untracked(this.sequence)];\n\t\t\tif (audioOptions) sequence.attachAudio(audioOptions);\n\t\t});\n\n\t\teffect(() => {\n\t\t\tconst [playOptions, sequence] = [this.playOptions(), untracked(this.sequence)];\n\t\t\tconst isPlaying = val(sequence.pointer.playing);\n\t\t\tif (isPlaying) {\n\t\t\t\tthis.pause();\n\t\t\t\tthis.play(playOptions);\n\t\t\t}\n\t\t});\n\n\t\teffect((onCleanup) => {\n\t\t\tconst sequence = this.sequence();\n\n\t\t\tconst cleanups: Array<() => void> = [];\n\n\t\t\tcleanups.push(\n\t\t\t\tonChange(sequence.pointer.position, (value) => this.position.set(value)),\n\t\t\t\tonChange(sequence.pointer.playing, (value) => this.playing.set(value)),\n\t\t\t\tonChange(sequence.pointer.length, (value) => this.length.set(value)),\n\t\t\t);\n\n\t\t\tonCleanup(() => {\n\t\t\t\tcleanups.forEach((cleanup) => cleanup());\n\t\t\t});\n\t\t});\n\t}\n\n\tpause() {\n\t\tconst sequence = this.sequence();\n\t\tsequence.pause();\n\t}\n\n\tplay(options: Parameters<ISequence['play']>[0] = {}) {\n\t\tconst sequence = this.sequence();\n\t\tconst project = this.project.project();\n\n\t\tproject.ready.then(() => {\n\t\t\tsequence.play({ ...this.playOptions(), ...options });\n\t\t});\n\t}\n\n\treset() {\n\t\tconst sequence = this.sequence();\n\t\tconst isPlaying = val(sequence.pointer.playing);\n\t\tsequence.position = 0;\n\t\tif (isPlaying) this.play();\n\t}\n}\n","export * from './lib/project';\nexport * from './lib/sheet-object';\nexport * from './lib/studio/studio';\n\nexport * from './lib/sequence';\nexport { TheatreSheet as TheatreSheetImpl } from './lib/sheet';\n\nimport { TheatreSequence } from './lib/sequence';\nimport { TheatreSheet as Impl } from './lib/sheet';\n\nexport const TheatreSheet = [Impl, TheatreSequence] as const;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["TheatreSheet","TheatreSheetObject","Impl"],"mappings":"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"}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from './lib/project';
|
|
2
|
+
export * from './lib/sheet-object';
|
|
3
|
+
export * from './lib/studio/studio';
|
|
4
|
+
export * from './lib/sequence';
|
|
5
|
+
export { TheatreSheet as TheatreSheetImpl } from './lib/sheet';
|
|
6
|
+
import { TheatreSequence } from './lib/sequence';
|
|
7
|
+
import { TheatreSheet as Impl } from './lib/sheet';
|
|
8
|
+
export declare const TheatreSheet: readonly [typeof Impl, typeof TheatreSequence];
|
package/lib/project.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type IProjectConfig, type ISheet } from '@theatre/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare class TheatreProject {
|
|
4
|
+
name: import("@angular/core").InputSignal<string>;
|
|
5
|
+
config: import("@angular/core").InputSignal<IProjectConfig>;
|
|
6
|
+
project: import("@angular/core").Signal<import("@theatre/core").IProject>;
|
|
7
|
+
sheets: Record<string, [sheet: ISheet, count: number]>;
|
|
8
|
+
constructor();
|
|
9
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TheatreProject, never>;
|
|
10
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<TheatreProject, "theatre-project", never, { "name": { "alias": "name"; "required": false; "isSignal": true; }; "config": { "alias": "config"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { type ISequence } from '@theatre/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export interface AttachAudioOptions {
|
|
4
|
+
/**
|
|
5
|
+
* Either a URL to the audio file (eg "http://localhost:3000/audio.mp3") or an instance of AudioBuffer
|
|
6
|
+
*/
|
|
7
|
+
source: string | AudioBuffer;
|
|
8
|
+
/**
|
|
9
|
+
* An optional AudioContext. If not provided, one will be created.
|
|
10
|
+
*/
|
|
11
|
+
audioContext?: AudioContext;
|
|
12
|
+
/**
|
|
13
|
+
* An AudioNode to feed the audio into. Will use audioContext.destination if not provided.
|
|
14
|
+
*/
|
|
15
|
+
destinationNode?: AudioNode;
|
|
16
|
+
}
|
|
17
|
+
export type TheatreSequenceOptions = Parameters<ISequence['play']>[0] & {
|
|
18
|
+
autoplay: boolean;
|
|
19
|
+
autopause: boolean;
|
|
20
|
+
delay: number;
|
|
21
|
+
autoreset?: 'init' | 'destroy' | 'always';
|
|
22
|
+
};
|
|
23
|
+
export declare class TheatreSequence {
|
|
24
|
+
options: import("@angular/core").InputSignalWithTransform<{
|
|
25
|
+
iterationCount?: number;
|
|
26
|
+
range?: [from: number, to: number];
|
|
27
|
+
rate?: number;
|
|
28
|
+
direction?: "reverse" | "normal" | "alternate" | "alternateReverse";
|
|
29
|
+
rafDriver?: import("@theatre/core").IRafDriver;
|
|
30
|
+
} & {
|
|
31
|
+
autoplay: boolean;
|
|
32
|
+
autopause: boolean;
|
|
33
|
+
delay: number;
|
|
34
|
+
autoreset?: "init" | "destroy" | "always";
|
|
35
|
+
}, "" | Partial<{
|
|
36
|
+
iterationCount?: number;
|
|
37
|
+
range?: [from: number, to: number];
|
|
38
|
+
rate?: number;
|
|
39
|
+
direction?: "reverse" | "normal" | "alternate" | "alternateReverse";
|
|
40
|
+
rafDriver?: import("@theatre/core").IRafDriver;
|
|
41
|
+
} & {
|
|
42
|
+
autoplay: boolean;
|
|
43
|
+
autopause: boolean;
|
|
44
|
+
delay: number;
|
|
45
|
+
autoreset?: "init" | "destroy" | "always";
|
|
46
|
+
}>>;
|
|
47
|
+
audioOptions: import("@angular/core").InputSignal<AttachAudioOptions | undefined>;
|
|
48
|
+
position: import("@angular/core").ModelSignal<number>;
|
|
49
|
+
playing: import("@angular/core").ModelSignal<boolean>;
|
|
50
|
+
length: import("@angular/core").ModelSignal<number>;
|
|
51
|
+
private playOptions;
|
|
52
|
+
private autoplay;
|
|
53
|
+
private autopause;
|
|
54
|
+
private autoreset;
|
|
55
|
+
private delay;
|
|
56
|
+
private project;
|
|
57
|
+
private sheet;
|
|
58
|
+
sequence: import("@angular/core").Signal<ISequence>;
|
|
59
|
+
constructor();
|
|
60
|
+
pause(): void;
|
|
61
|
+
play(options?: Parameters<ISequence['play']>[0]): void;
|
|
62
|
+
reset(): void;
|
|
63
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TheatreSequence, never>;
|
|
64
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<TheatreSequence, "[sheet][sequence]", ["sequence"], { "options": { "alias": "sequence"; "required": false; "isSignal": true; }; "audioOptions": { "alias": "sequenceAudio"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "playing": { "alias": "playing"; "required": false; "isSignal": true; }; "length": { "alias": "length"; "required": false; "isSignal": true; }; }, { "position": "positionChange"; "playing": "playingChange"; "length": "lengthChange"; }, never, never, true, never>;
|
|
65
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { TheatreSheetObject as Impl } from './sheet-object';
|
|
2
|
+
import { TheatreSheetObjectSync } from './sync';
|
|
3
|
+
import { TheatreSheetObjectTransform } from './transform';
|
|
4
|
+
export { TheatreSheetObject as TheatreSheetObjectImpl } from './sheet-object';
|
|
5
|
+
export * from './sync';
|
|
6
|
+
export * from './transform';
|
|
7
|
+
export declare const TheatreSheetObject: (typeof Impl | typeof TheatreSheetObjectSync | typeof TheatreSheetObjectTransform)[];
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { UnknownShorthandCompoundProps } from '@theatre/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare class TheatreSheetObject {
|
|
4
|
+
key: import("@angular/core").InputSignal<string>;
|
|
5
|
+
props: import("@angular/core").InputSignal<UnknownShorthandCompoundProps>;
|
|
6
|
+
detach: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
|
|
7
|
+
selected: import("@angular/core").ModelSignal<boolean>;
|
|
8
|
+
private templateRef;
|
|
9
|
+
private vcr;
|
|
10
|
+
private sheet;
|
|
11
|
+
private studio;
|
|
12
|
+
private store;
|
|
13
|
+
private originalSheetObject;
|
|
14
|
+
sheetObject: import("@angular/core").WritableSignal<import("@theatre/core").ISheetObject<UnknownShorthandCompoundProps>>;
|
|
15
|
+
values: import("@angular/core").WritableSignal<{
|
|
16
|
+
[x: string]: any;
|
|
17
|
+
}>;
|
|
18
|
+
private detached;
|
|
19
|
+
private aggregatedProps;
|
|
20
|
+
constructor();
|
|
21
|
+
update(): void;
|
|
22
|
+
addProps(props: UnknownShorthandCompoundProps): void;
|
|
23
|
+
removeProps(props: string[]): void;
|
|
24
|
+
select(): void;
|
|
25
|
+
deselect(): void;
|
|
26
|
+
static ngTemplateContextGuard(_: TheatreSheetObject, ctx: unknown): ctx is {
|
|
27
|
+
select: TheatreSheetObject['select'];
|
|
28
|
+
deselect: TheatreSheetObject['deselect'];
|
|
29
|
+
sheetObject: ReturnType<TheatreSheetObject['sheetObject']['asReadonly']>;
|
|
30
|
+
values: ReturnType<TheatreSheetObject['values']['asReadonly']>;
|
|
31
|
+
};
|
|
32
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TheatreSheetObject, never>;
|
|
33
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<TheatreSheetObject, "ng-template[sheetObject]", ["sheetObject"], { "key": { "alias": "sheetObject"; "required": true; "isSignal": true; }; "props": { "alias": "sheetObjectProps"; "required": false; "isSignal": true; }; "detach": { "alias": "sheetObjectDetach"; "required": false; "isSignal": true; }; "selected": { "alias": "sheetObjectSelected"; "required": false; "isSignal": true; }; }, { "selected": "sheetObjectSelectedChange"; }, never, never, true, never>;
|
|
34
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ElementRef } from '@angular/core';
|
|
2
|
+
import { TheatreTransformer } from '../transformers/transformer';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export declare class TheatreSheetObjectSync<TObject extends object> {
|
|
5
|
+
parent: import("@angular/core").InputSignal<TObject | ElementRef<TObject> | (() => TObject | ElementRef<TObject> | undefined | null)>;
|
|
6
|
+
props: import("@angular/core").InputSignal<(string | [string, string | {
|
|
7
|
+
label?: string;
|
|
8
|
+
key?: string;
|
|
9
|
+
transformer?: TheatreTransformer;
|
|
10
|
+
}])[]>;
|
|
11
|
+
private theatreSheetObject;
|
|
12
|
+
sheetObject: import("@angular/core").Signal<import("@theatre/core").ISheetObject<import("@theatre/core").UnknownShorthandCompoundProps>>;
|
|
13
|
+
private studio;
|
|
14
|
+
private parentRef;
|
|
15
|
+
private resolvedProps;
|
|
16
|
+
private propsToAdd;
|
|
17
|
+
private propsMapping;
|
|
18
|
+
constructor();
|
|
19
|
+
capture(): void;
|
|
20
|
+
private resolvePropertyPath;
|
|
21
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TheatreSheetObjectSync<any>, never>;
|
|
22
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<TheatreSheetObjectSync<any>, "[sync]", ["sync"], { "parent": { "alias": "sync"; "required": true; "isSignal": true; }; "props": { "alias": "syncProps"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
23
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ElementRef } from '@angular/core';
|
|
2
|
+
import { NgtsTransformControlsOptions } from 'angular-three-soba/gizmos';
|
|
3
|
+
import * as THREE from 'three';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export declare class TheatreSheetObjectTransform<TLabel extends string | undefined> {
|
|
6
|
+
label: import("@angular/core").InputSignal<TLabel | undefined>;
|
|
7
|
+
key: import("@angular/core").InputSignal<string | undefined>;
|
|
8
|
+
options: import("@angular/core").InputSignal<Pick<NgtsTransformControlsOptions, "mode" | "translationSnap" | "scaleSnap" | "rotationSnap" | "space">>;
|
|
9
|
+
groupRef: import("@angular/core").Signal<ElementRef<THREE.Group<THREE.Object3DEventMap>>>;
|
|
10
|
+
private controlsRef;
|
|
11
|
+
private theatreSheetObject;
|
|
12
|
+
sheetObject: import("@angular/core").Signal<import("@theatre/core").ISheetObject<import("@theatre/core").UnknownShorthandCompoundProps>>;
|
|
13
|
+
private studio;
|
|
14
|
+
protected selected: import("@angular/core").Signal<boolean>;
|
|
15
|
+
private scrub?;
|
|
16
|
+
private positionTransformer;
|
|
17
|
+
private rotationTransformer;
|
|
18
|
+
private scaleTransformer;
|
|
19
|
+
protected onMouseDown(): void;
|
|
20
|
+
protected onMouseUp(): void;
|
|
21
|
+
protected onChange(): void;
|
|
22
|
+
constructor();
|
|
23
|
+
private init;
|
|
24
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TheatreSheetObjectTransform<any>, never>;
|
|
25
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<TheatreSheetObjectTransform<any>, "theatre-transform", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "key": { "alias": "key"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
|
|
26
|
+
}
|
package/lib/sheet.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
export declare class TheatreSheet {
|
|
3
|
+
name: import("@angular/core").InputSignalWithTransform<string, string>;
|
|
4
|
+
private project;
|
|
5
|
+
sheet: import("@angular/core").Signal<import("@theatre/core").ISheet>;
|
|
6
|
+
constructor();
|
|
7
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TheatreSheet, never>;
|
|
8
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<TheatreSheet, "[sheet]", ["sheet"], { "name": { "alias": "sheet"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type IStudio } from '@theatre/studio';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare class TheatreStudio {
|
|
4
|
+
enabled: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
|
|
5
|
+
private Studio;
|
|
6
|
+
studio: import("@angular/core").Signal<IStudio | null>;
|
|
7
|
+
constructor();
|
|
8
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TheatreStudio, never>;
|
|
9
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<TheatreStudio, "theatre-project[studio]", ["studio"], { "enabled": { "alias": "studio"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
10
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const color: import("./transformer").TheatreTransformer<any, any>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function getDefaultTransformer(target: any, path: string, fullPropertyPath: string): import("./transformer").TheatreTransformer<any, any>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const degrees: import("./transformer").TheatreTransformer<any, any>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const euler: import("./transformer").TheatreTransformer<any, any>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const generic: import("./transformer").TheatreTransformer<any, any>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const normalized: import("./transformer").TheatreTransformer<any, any>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const side: import("./transformer").TheatreTransformer<any, any>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { types } from '@theatre/core';
|
|
2
|
+
/**
|
|
3
|
+
https://github.com/threlte/threlte/blob/main/packages/theatre/src/lib/sheetObject/transfomers/types.ts
|
|
4
|
+
*/
|
|
5
|
+
export type TheatreTransformer<Value = any, TransformedValue = any> = {
|
|
6
|
+
/**
|
|
7
|
+
* The `transform` function is used to transform the value of a certain
|
|
8
|
+
* Three.js objects proerty to a property that Theatre.js can use in an
|
|
9
|
+
* `ISheetObject`. To ensure compatibility with the rest of the package, the
|
|
10
|
+
* return value must be any one of the functions available at Theatre.js'
|
|
11
|
+
* `types`.
|
|
12
|
+
*/
|
|
13
|
+
transform: (value: Value) => ReturnType<(typeof types)[keyof typeof types]>;
|
|
14
|
+
/**
|
|
15
|
+
* The `apply` function is used to apply the value to the target. `target` is
|
|
16
|
+
* the parent object of the property (usually a Three.js object), `path` is
|
|
17
|
+
* the name of the property and `value` is the value to apply.
|
|
18
|
+
*/
|
|
19
|
+
apply: (target: any, property: string, value: TransformedValue) => void;
|
|
20
|
+
};
|
|
21
|
+
export declare function createTransformer(transformer: TheatreTransformer): TheatreTransformer<any, any>;
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "angular-three-theatre",
|
|
3
|
+
"version": "4.0.0-next.100",
|
|
4
|
+
"publishConfig": {
|
|
5
|
+
"access": "public"
|
|
6
|
+
},
|
|
7
|
+
"type": "module",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/angular-threejs/angular-three/tree/main/libs/theatre"
|
|
11
|
+
},
|
|
12
|
+
"author": {
|
|
13
|
+
"name": "Chau Tran",
|
|
14
|
+
"email": "nartc7789@gmail.com",
|
|
15
|
+
"url": "https://nartc.me"
|
|
16
|
+
},
|
|
17
|
+
"description": "TheatreJS for Angular Three",
|
|
18
|
+
"keywords": [
|
|
19
|
+
"angular",
|
|
20
|
+
"threejs",
|
|
21
|
+
"renderer",
|
|
22
|
+
"theatre"
|
|
23
|
+
],
|
|
24
|
+
"license": "MIT",
|
|
25
|
+
"peerDependencies": {
|
|
26
|
+
"@angular/common": ">=19.0.0 <20.0.0",
|
|
27
|
+
"@angular/core": ">=19.0.0 <20.0.0",
|
|
28
|
+
"@theatre/core": ">=0.7.0 <0.8.0",
|
|
29
|
+
"@theatre/studio": ">=0.7.0 <0.8.0",
|
|
30
|
+
"three": ">=0.157.0 <0.175.0"
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"tslib": "^2.7.0"
|
|
34
|
+
},
|
|
35
|
+
"module": "fesm2022/angular-three-theatre.mjs",
|
|
36
|
+
"typings": "index.d.ts",
|
|
37
|
+
"exports": {
|
|
38
|
+
"./package.json": {
|
|
39
|
+
"default": "./package.json"
|
|
40
|
+
},
|
|
41
|
+
".": {
|
|
42
|
+
"types": "./index.d.ts",
|
|
43
|
+
"default": "./fesm2022/angular-three-theatre.mjs"
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"sideEffects": false
|
|
47
|
+
}
|