@blcklab/anyo-avatar-vue 0.2.0-alpha.2
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/CHANGELOG.md +33 -0
- package/LICENSE +9 -0
- package/README.md +138 -0
- package/dist/AnyoAvatarControls.d.ts +4 -0
- package/dist/AnyoAvatarControls.d.ts.map +1 -0
- package/dist/AnyoAvatarControls.js +239 -0
- package/dist/AnyoAvatarControls.js.map +1 -0
- package/dist/AnyoAvatarViewer.d.ts +4 -0
- package/dist/AnyoAvatarViewer.d.ts.map +1 -0
- package/dist/AnyoAvatarViewer.js +246 -0
- package/dist/AnyoAvatarViewer.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/injection.d.ts +6 -0
- package/dist/injection.d.ts.map +1 -0
- package/dist/injection.js +10 -0
- package/dist/injection.js.map +1 -0
- package/dist/plugin.d.ts +6 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +16 -0
- package/dist/plugin.js.map +1 -0
- package/dist/presets.d.ts +4 -0
- package/dist/presets.d.ts.map +1 -0
- package/dist/presets.js +54 -0
- package/dist/presets.js.map +1 -0
- package/dist/scene.d.ts +42 -0
- package/dist/scene.d.ts.map +1 -0
- package/dist/scene.js +431 -0
- package/dist/scene.js.map +1 -0
- package/dist/source.d.ts +8 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +53 -0
- package/dist/source.js.map +1 -0
- package/dist/style.css +68 -0
- package/dist/types.d.ts +252 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/useAnyoAvatarViewer.d.ts +49 -0
- package/dist/useAnyoAvatarViewer.d.ts.map +1 -0
- package/dist/useAnyoAvatarViewer.js +454 -0
- package/dist/useAnyoAvatarViewer.js.map +1 -0
- package/docs/API.md +78 -0
- package/docs/HIGH-END-PROPS.md +63 -0
- package/docs/PRESETS.md +14 -0
- package/docs/README.md +9 -0
- package/package.json +72 -0
|
@@ -0,0 +1,454 @@
|
|
|
1
|
+
import { computed, onBeforeUnmount, onMounted, ref, shallowRef, watch, } from 'vue';
|
|
2
|
+
import { createSekai64AvatarViewer, } from '@blcklab/anyo-avatar-viewer/browser';
|
|
3
|
+
import { withAnimationSource, withModelSource } from './source.js';
|
|
4
|
+
import { AnyoSceneModelManager, mergeSceneModelConfig } from './scene.js';
|
|
5
|
+
const EMPTY_VIEWER = Object.freeze({
|
|
6
|
+
phase: 'empty', model: null, clips: Object.freeze([]), loadingAnimations: 0, error: null,
|
|
7
|
+
status: 'stopped', clip: null, time: 0, duration: 0, speed: 1,
|
|
8
|
+
bounds: null, expressions: Object.freeze({ available: Object.freeze([]), values: Object.freeze({}) }), lookAt: null,
|
|
9
|
+
});
|
|
10
|
+
export function useAnyoAvatarViewer(options) {
|
|
11
|
+
const viewerState = shallowRef(EMPTY_VIEWER);
|
|
12
|
+
const cameraState = shallowRef(null);
|
|
13
|
+
const recoveryState = shallowRef(null);
|
|
14
|
+
const ready = ref(false);
|
|
15
|
+
const backend = ref('');
|
|
16
|
+
const diagnostic = ref('');
|
|
17
|
+
const fatalError = ref('');
|
|
18
|
+
const fullscreen = ref(false);
|
|
19
|
+
const sceneModels = shallowRef(Object.freeze([]));
|
|
20
|
+
let runtime;
|
|
21
|
+
let sceneManager;
|
|
22
|
+
let unsubscribeViewer;
|
|
23
|
+
let unsubscribeCamera;
|
|
24
|
+
let unsubscribeRecovery;
|
|
25
|
+
let currentModel;
|
|
26
|
+
let currentAnimations = [];
|
|
27
|
+
let disposed = false;
|
|
28
|
+
let recreateQueue = Promise.resolve();
|
|
29
|
+
let modelPicker;
|
|
30
|
+
let animationPicker;
|
|
31
|
+
let propPicker;
|
|
32
|
+
let propAnimationPicker;
|
|
33
|
+
let propAnimationTarget = '';
|
|
34
|
+
let sceneSequence = 0;
|
|
35
|
+
const sceneMemory = new Map();
|
|
36
|
+
const hasModel = computed(() => viewerState.value.phase === 'ready' && Boolean(viewerState.value.model));
|
|
37
|
+
const isPlaying = computed(() => viewerState.value.status === 'playing');
|
|
38
|
+
async function initialize() {
|
|
39
|
+
if (runtime || disposed)
|
|
40
|
+
return;
|
|
41
|
+
const canvas = options.canvas.value;
|
|
42
|
+
if (!canvas)
|
|
43
|
+
return;
|
|
44
|
+
try {
|
|
45
|
+
const value = options.options.value;
|
|
46
|
+
runtime = await createSekai64AvatarViewer({
|
|
47
|
+
canvas,
|
|
48
|
+
backend: value.backend,
|
|
49
|
+
pixelRatio: value.pixelRatio,
|
|
50
|
+
maxPixelRatio: value.maxPixelRatio,
|
|
51
|
+
quality: value.quality,
|
|
52
|
+
environment: value.environment,
|
|
53
|
+
background: value.transparent ? [0, 0, 0, 0] : value.background,
|
|
54
|
+
transparent: value.transparent,
|
|
55
|
+
exposure: value.exposure,
|
|
56
|
+
shadows: value.shadows,
|
|
57
|
+
navigation: value.navigation,
|
|
58
|
+
pointerPan: value.pointerPan,
|
|
59
|
+
autoFit: value.autoFit,
|
|
60
|
+
autoRotate: value.autoRotate,
|
|
61
|
+
autoRotateSpeed: value.autoRotateSpeed,
|
|
62
|
+
recovery: value.recovery,
|
|
63
|
+
normalization: value.normalization,
|
|
64
|
+
targetHeight: value.targetHeight,
|
|
65
|
+
vrma: value.vrma,
|
|
66
|
+
importers: value.importers,
|
|
67
|
+
onDiagnostic(message) {
|
|
68
|
+
diagnostic.value = message;
|
|
69
|
+
options.onDiagnostic?.(message);
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
sceneManager = new AnyoSceneModelManager(runtime, {
|
|
73
|
+
onProgress: progress => options.onPropProgress?.(progress),
|
|
74
|
+
onDiagnostic: value => {
|
|
75
|
+
diagnostic.value = `[${value.id}] ${value.message}`;
|
|
76
|
+
options.onPropDiagnostic?.(value);
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
backend.value = String(runtime.engine.capabilities.backend ?? '').toUpperCase();
|
|
80
|
+
viewerState.value = runtime.viewer.getSnapshot();
|
|
81
|
+
cameraState.value = runtime.navigation.getSnapshot();
|
|
82
|
+
recoveryState.value = runtime.recovery.getSnapshot();
|
|
83
|
+
unsubscribeViewer = runtime.viewer.subscribe(() => {
|
|
84
|
+
if (!runtime)
|
|
85
|
+
return;
|
|
86
|
+
viewerState.value = runtime.viewer.getSnapshot();
|
|
87
|
+
options.onStateChange?.(viewerState.value);
|
|
88
|
+
});
|
|
89
|
+
unsubscribeCamera = runtime.navigation.subscribe(() => {
|
|
90
|
+
if (!runtime)
|
|
91
|
+
return;
|
|
92
|
+
cameraState.value = runtime.navigation.getSnapshot();
|
|
93
|
+
options.onCameraChange?.(cameraState.value);
|
|
94
|
+
});
|
|
95
|
+
unsubscribeRecovery = runtime.recovery.subscribe(() => {
|
|
96
|
+
if (!runtime)
|
|
97
|
+
return;
|
|
98
|
+
recoveryState.value = runtime.recovery.getSnapshot();
|
|
99
|
+
options.onRecoveryChange?.(recoveryState.value);
|
|
100
|
+
});
|
|
101
|
+
ready.value = true;
|
|
102
|
+
fatalError.value = '';
|
|
103
|
+
options.onReady?.(runtime);
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
fatalError.value = error instanceof Error ? error.message : String(error);
|
|
107
|
+
options.onError?.(error);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
async function destroyRuntime() {
|
|
111
|
+
unsubscribeViewer?.();
|
|
112
|
+
unsubscribeViewer = undefined;
|
|
113
|
+
unsubscribeCamera?.();
|
|
114
|
+
unsubscribeCamera = undefined;
|
|
115
|
+
unsubscribeRecovery?.();
|
|
116
|
+
unsubscribeRecovery = undefined;
|
|
117
|
+
const previous = runtime;
|
|
118
|
+
sceneManager?.dispose();
|
|
119
|
+
sceneManager = undefined;
|
|
120
|
+
runtime = undefined;
|
|
121
|
+
ready.value = false;
|
|
122
|
+
backend.value = '';
|
|
123
|
+
viewerState.value = EMPTY_VIEWER;
|
|
124
|
+
cameraState.value = null;
|
|
125
|
+
recoveryState.value = null;
|
|
126
|
+
sceneModels.value = Object.freeze([]);
|
|
127
|
+
if (previous)
|
|
128
|
+
await previous.dispose();
|
|
129
|
+
}
|
|
130
|
+
async function recreate() {
|
|
131
|
+
recreateQueue = recreateQueue.then(async () => {
|
|
132
|
+
if (disposed)
|
|
133
|
+
return;
|
|
134
|
+
const model = currentModel;
|
|
135
|
+
const animations = [...currentAnimations];
|
|
136
|
+
await destroyRuntime();
|
|
137
|
+
await initialize();
|
|
138
|
+
if (model) {
|
|
139
|
+
await loadModel(model, false);
|
|
140
|
+
for (const animation of animations)
|
|
141
|
+
await loadAnimation(animation, false);
|
|
142
|
+
}
|
|
143
|
+
if (sceneManager) {
|
|
144
|
+
for (const { input, config } of sceneMemory.values())
|
|
145
|
+
await sceneManager.load(input, config);
|
|
146
|
+
refreshSceneModels();
|
|
147
|
+
}
|
|
148
|
+
}).catch(error => { options.onError?.(error); });
|
|
149
|
+
return recreateQueue;
|
|
150
|
+
}
|
|
151
|
+
async function loadModel(input, remember = true) {
|
|
152
|
+
await requireRuntime();
|
|
153
|
+
await withModelSource(input, source => runtime.viewer.loadModel(source));
|
|
154
|
+
if (remember) {
|
|
155
|
+
currentModel = input;
|
|
156
|
+
currentAnimations = [];
|
|
157
|
+
}
|
|
158
|
+
options.onModelLoaded?.();
|
|
159
|
+
}
|
|
160
|
+
async function loadAnimation(input, remember = true) {
|
|
161
|
+
await requireRuntime();
|
|
162
|
+
if (!hasModel.value)
|
|
163
|
+
throw new Error('Load an avatar model before loading an animation.');
|
|
164
|
+
await withAnimationSource(input, source => runtime.viewer.loadAnimation(source));
|
|
165
|
+
if (remember)
|
|
166
|
+
currentAnimations.push(input);
|
|
167
|
+
options.onAnimationLoaded?.();
|
|
168
|
+
}
|
|
169
|
+
async function loadScene(config, loadOptions = {}) {
|
|
170
|
+
await requireRuntime();
|
|
171
|
+
const replace = loadOptions.replace ?? true;
|
|
172
|
+
if (replace) {
|
|
173
|
+
sceneManager.clear();
|
|
174
|
+
sceneMemory.clear();
|
|
175
|
+
}
|
|
176
|
+
for (const item of config.props ?? []) {
|
|
177
|
+
const merged = mergeSceneModelConfig(item, config.defaults);
|
|
178
|
+
const { src, ...rest } = merged;
|
|
179
|
+
await loadProp(src, rest);
|
|
180
|
+
}
|
|
181
|
+
return sceneModels.value;
|
|
182
|
+
}
|
|
183
|
+
async function loadProp(input, config = {}) {
|
|
184
|
+
await requireRuntime();
|
|
185
|
+
const id = config.id?.trim() || `vue-scene-model-${++sceneSequence}`;
|
|
186
|
+
const normalized = { ...config, id };
|
|
187
|
+
const info = await sceneManager.load(input, normalized);
|
|
188
|
+
sceneMemory.set(id, { input, config: normalized });
|
|
189
|
+
refreshSceneModels();
|
|
190
|
+
options.onPropLoaded?.(info);
|
|
191
|
+
return info;
|
|
192
|
+
}
|
|
193
|
+
async function loadPropAnimation(id, config) {
|
|
194
|
+
await requireRuntime();
|
|
195
|
+
const info = await sceneManager.loadAnimation(id, config);
|
|
196
|
+
const remembered = sceneMemory.get(id);
|
|
197
|
+
if (remembered) {
|
|
198
|
+
const animations = [...(remembered.config.animations ?? []), config];
|
|
199
|
+
sceneMemory.set(id, { ...remembered, config: { ...remembered.config, animations } });
|
|
200
|
+
}
|
|
201
|
+
refreshSceneModels();
|
|
202
|
+
options.onPropAnimationLoaded?.(info);
|
|
203
|
+
return info;
|
|
204
|
+
}
|
|
205
|
+
function playProp(id, clip, playOptions = {}) {
|
|
206
|
+
const info = requireSceneManager().play(id, clip, playOptions);
|
|
207
|
+
refreshSceneModels();
|
|
208
|
+
return info;
|
|
209
|
+
}
|
|
210
|
+
function pauseProp(id) { const info = requireSceneManager().pause(id); refreshSceneModels(); return info; }
|
|
211
|
+
function resumeProp(id) { const info = requireSceneManager().resume(id); refreshSceneModels(); return info; }
|
|
212
|
+
function stopProp(id) { const info = requireSceneManager().stop(id); refreshSceneModels(); return info; }
|
|
213
|
+
function updateProp(id, transform) {
|
|
214
|
+
const info = requireSceneManager().update(id, transform);
|
|
215
|
+
const remembered = sceneMemory.get(id);
|
|
216
|
+
if (remembered)
|
|
217
|
+
sceneMemory.set(id, { ...remembered, config: { ...remembered.config, ...transform } });
|
|
218
|
+
refreshSceneModels();
|
|
219
|
+
return info;
|
|
220
|
+
}
|
|
221
|
+
function setPropVisible(id, visible) {
|
|
222
|
+
const info = requireSceneManager().setVisible(id, visible);
|
|
223
|
+
const remembered = sceneMemory.get(id);
|
|
224
|
+
if (remembered)
|
|
225
|
+
sceneMemory.set(id, { ...remembered, config: { ...remembered.config, visible } });
|
|
226
|
+
refreshSceneModels();
|
|
227
|
+
return info;
|
|
228
|
+
}
|
|
229
|
+
function removeProp(id) { requireSceneManager().remove(id); sceneMemory.delete(id); refreshSceneModels(); }
|
|
230
|
+
function clearProps() { sceneManager?.clear(); sceneMemory.clear(); refreshSceneModels(); }
|
|
231
|
+
function refreshSceneModels() {
|
|
232
|
+
sceneModels.value = sceneManager?.list() ?? Object.freeze([]);
|
|
233
|
+
options.onSceneChange?.(sceneModels.value);
|
|
234
|
+
}
|
|
235
|
+
function unload() {
|
|
236
|
+
runtime?.viewer.unload();
|
|
237
|
+
currentModel = undefined;
|
|
238
|
+
currentAnimations = [];
|
|
239
|
+
}
|
|
240
|
+
function play(clipId, playOptions = {}) {
|
|
241
|
+
const rt = requireRuntimeSync();
|
|
242
|
+
const id = clipId || viewerState.value.clip || viewerState.value.clips[0]?.id;
|
|
243
|
+
if (!id)
|
|
244
|
+
return;
|
|
245
|
+
rt.viewer.play(id, { loop: 'repeat', speed: viewerState.value.speed, fade: 0.2, ...playOptions });
|
|
246
|
+
}
|
|
247
|
+
function pause() { requireRuntimeSync().viewer.pause(); }
|
|
248
|
+
function resume() { requireRuntimeSync().viewer.resume(); }
|
|
249
|
+
function togglePlayback(clipId) {
|
|
250
|
+
const rt = requireRuntimeSync();
|
|
251
|
+
if (viewerState.value.status === 'playing')
|
|
252
|
+
rt.viewer.pause();
|
|
253
|
+
else if (viewerState.value.status === 'paused' && (!clipId || clipId === viewerState.value.clip))
|
|
254
|
+
rt.viewer.resume();
|
|
255
|
+
else
|
|
256
|
+
play(clipId);
|
|
257
|
+
}
|
|
258
|
+
function stop() { requireRuntimeSync().viewer.stop(); }
|
|
259
|
+
function seek(seconds) { requireRuntimeSync().viewer.seek(seconds); }
|
|
260
|
+
function setSpeed(speed) { requireRuntimeSync().viewer.setSpeed(speed); }
|
|
261
|
+
function fit() { requireRuntimeSync().navigation.fit(); }
|
|
262
|
+
function resetView() { requireRuntimeSync().navigation.resetView(); }
|
|
263
|
+
function focus(preset) { requireRuntimeSync().navigation.focus(preset); }
|
|
264
|
+
function focusAt(target, distance) { requireRuntimeSync().navigation.focusAt(target, distance); }
|
|
265
|
+
function focusHeight(ratio, distance) { requireRuntimeSync().navigation.focusHeight(ratio, distance); }
|
|
266
|
+
function focusUp(step) { requireRuntimeSync().navigation.focusUp(step); }
|
|
267
|
+
function focusDown(step) { requireRuntimeSync().navigation.focusDown(step); }
|
|
268
|
+
function zoomIn() { requireRuntimeSync().navigation.zoomIn(); }
|
|
269
|
+
function zoomOut() { requireRuntimeSync().navigation.zoomOut(); }
|
|
270
|
+
function rotateLeft() { requireRuntimeSync().navigation.rotateLeft(); }
|
|
271
|
+
function rotateRight() { requireRuntimeSync().navigation.rotateRight(); }
|
|
272
|
+
function panBy(x, y) { requireRuntimeSync().navigation.panBy(x, y); }
|
|
273
|
+
function setAutoRotate(enabled) { requireRuntimeSync().navigation.setAutoRotate(enabled); }
|
|
274
|
+
function setAutoRotateSpeed(speed) { requireRuntimeSync().navigation.setAutoRotateSpeed(speed); }
|
|
275
|
+
function setNavigationEnabled(enabled) { requireRuntimeSync().navigation.setEnabled(enabled); }
|
|
276
|
+
function setQuality(value) { requireRuntimeSync().visuals.setQuality(value); }
|
|
277
|
+
function setEnvironment(value) { requireRuntimeSync().visuals.setEnvironment(value); }
|
|
278
|
+
function setBackground(value) { requireRuntimeSync().visuals.setBackground(options.options.value.transparent ? [0, 0, 0, 0] : value); }
|
|
279
|
+
function setExposure(value) { requireRuntimeSync().visuals.setExposure(value); }
|
|
280
|
+
function setShadows(value) { requireRuntimeSync().visuals.setShadows(value); }
|
|
281
|
+
function setExpression(name, weight) { return requireRuntimeSync().viewer.setExpression(name, weight); }
|
|
282
|
+
function clearExpression(name) { return requireRuntimeSync().viewer.clearExpression(name); }
|
|
283
|
+
function resetExpressions() { requireRuntimeSync().viewer.resetExpressions(); }
|
|
284
|
+
function setLookAt(target, lookAtOptions = {}) { requireRuntimeSync().viewer.setLookAt(target, lookAtOptions); }
|
|
285
|
+
function clearLookAt() { requireRuntimeSync().viewer.clearLookAt(); }
|
|
286
|
+
function recover(reason) { return requireRuntimeSync().recovery.recover(reason); }
|
|
287
|
+
function start() { requireRuntimeSync().start(); }
|
|
288
|
+
function suspend() { requireRuntimeSync().stop(); }
|
|
289
|
+
async function screenshot(filename = 'anyo-avatar.png') {
|
|
290
|
+
const rt = requireRuntimeSync();
|
|
291
|
+
rt.engine.render(rt.scene, rt.camera);
|
|
292
|
+
const canvas = options.canvas.value;
|
|
293
|
+
if (!canvas)
|
|
294
|
+
throw new Error('Avatar canvas is unavailable.');
|
|
295
|
+
const blob = await new Promise((resolve, reject) => canvas.toBlob(value => value ? resolve(value) : reject(new Error('Unable to capture canvas.')), 'image/png'));
|
|
296
|
+
if (typeof document !== 'undefined') {
|
|
297
|
+
const url = URL.createObjectURL(blob);
|
|
298
|
+
const anchor = document.createElement('a');
|
|
299
|
+
anchor.href = url;
|
|
300
|
+
anchor.download = filename;
|
|
301
|
+
anchor.click();
|
|
302
|
+
setTimeout(() => URL.revokeObjectURL(url), 0);
|
|
303
|
+
}
|
|
304
|
+
return blob;
|
|
305
|
+
}
|
|
306
|
+
async function enterFullscreen() {
|
|
307
|
+
const host = options.host.value;
|
|
308
|
+
if (!host?.requestFullscreen)
|
|
309
|
+
throw new Error('Fullscreen is not available for this viewer.');
|
|
310
|
+
await host.requestFullscreen();
|
|
311
|
+
}
|
|
312
|
+
async function exitFullscreen() { if (typeof document !== 'undefined' && document.fullscreenElement)
|
|
313
|
+
await document.exitFullscreen(); }
|
|
314
|
+
async function toggleFullscreen() { if (typeof document !== 'undefined' && document.fullscreenElement === options.host.value)
|
|
315
|
+
await exitFullscreen();
|
|
316
|
+
else
|
|
317
|
+
await enterFullscreen(); }
|
|
318
|
+
function openModelPicker() { ensurePickers(); modelPicker?.click(); }
|
|
319
|
+
function openAnimationPicker() { ensurePickers(); animationPicker?.click(); }
|
|
320
|
+
function openPropPicker() { ensurePickers(); propPicker?.click(); }
|
|
321
|
+
function openPropAnimationPicker(id) { propAnimationTarget = id; ensurePickers(); propAnimationPicker?.click(); }
|
|
322
|
+
function ensurePickers() {
|
|
323
|
+
if (typeof document === 'undefined')
|
|
324
|
+
return;
|
|
325
|
+
if (!modelPicker) {
|
|
326
|
+
modelPicker = createPicker('.vrm,.glb,.gltf', async (file) => { if (file)
|
|
327
|
+
await loadModel(file).catch(error => options.onError?.(error)); });
|
|
328
|
+
animationPicker = createPicker('.vrma,.glb,.gltf', async (file) => { if (file)
|
|
329
|
+
await loadAnimation(file).catch(error => options.onError?.(error)); });
|
|
330
|
+
propPicker = createPicker('.glb', async (file) => { if (file)
|
|
331
|
+
await loadProp(file).catch(error => options.onError?.(error)); });
|
|
332
|
+
propAnimationPicker = createPicker('.glb,.gltf', async (file) => {
|
|
333
|
+
if (file && propAnimationTarget)
|
|
334
|
+
await loadPropAnimation(propAnimationTarget, { src: file }).catch(error => options.onError?.(error));
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
async function dispose() {
|
|
339
|
+
if (disposed)
|
|
340
|
+
return;
|
|
341
|
+
disposed = true;
|
|
342
|
+
removeFullscreenListener();
|
|
343
|
+
modelPicker?.remove();
|
|
344
|
+
animationPicker?.remove();
|
|
345
|
+
propPicker?.remove();
|
|
346
|
+
propAnimationPicker?.remove();
|
|
347
|
+
modelPicker = undefined;
|
|
348
|
+
animationPicker = undefined;
|
|
349
|
+
propPicker = undefined;
|
|
350
|
+
propAnimationPicker = undefined;
|
|
351
|
+
await destroyRuntime();
|
|
352
|
+
}
|
|
353
|
+
const publicState = computed(() => Object.freeze({
|
|
354
|
+
viewer: viewerState.value,
|
|
355
|
+
camera: cameraState.value,
|
|
356
|
+
recovery: recoveryState.value,
|
|
357
|
+
ready: ready.value,
|
|
358
|
+
backend: backend.value,
|
|
359
|
+
diagnostic: diagnostic.value,
|
|
360
|
+
fatalError: fatalError.value,
|
|
361
|
+
fullscreen: fullscreen.value,
|
|
362
|
+
sceneModels: sceneModels.value,
|
|
363
|
+
}));
|
|
364
|
+
const handle = {
|
|
365
|
+
get state() { return publicState.value; },
|
|
366
|
+
getRuntime: () => runtime ?? null,
|
|
367
|
+
loadModel: input => loadModel(input),
|
|
368
|
+
loadModelFile: file => loadModel(file),
|
|
369
|
+
loadAnimation: input => loadAnimation(input),
|
|
370
|
+
loadAnimationFile: file => loadAnimation(file),
|
|
371
|
+
loadScene,
|
|
372
|
+
loadProp,
|
|
373
|
+
loadPropFile: (file, config) => loadProp(file, config),
|
|
374
|
+
loadPropAnimation,
|
|
375
|
+
loadPropAnimationFile: (id, file, config = {}) => loadPropAnimation(id, { ...config, src: file }),
|
|
376
|
+
playProp, pauseProp, resumeProp, stopProp, updateProp, setPropVisible, removeProp, clearProps,
|
|
377
|
+
unload, play, pause, resume, togglePlayback, stop, seek, setSpeed,
|
|
378
|
+
fit, resetView, focus, focusAt, focusHeight, focusUp, focusDown,
|
|
379
|
+
zoomIn, zoomOut, rotateLeft, rotateRight, panBy,
|
|
380
|
+
setAutoRotate, setAutoRotateSpeed, setNavigationEnabled,
|
|
381
|
+
setQuality, setEnvironment, setBackground, setExposure, setShadows,
|
|
382
|
+
setExpression, clearExpression, resetExpressions, setLookAt, clearLookAt,
|
|
383
|
+
recover, start, suspend, screenshot, enterFullscreen, exitFullscreen, toggleFullscreen,
|
|
384
|
+
openModelPicker, openAnimationPicker, openPropPicker, openPropAnimationPicker, recreate, dispose,
|
|
385
|
+
};
|
|
386
|
+
function onFullscreenChange() { fullscreen.value = typeof document !== 'undefined' && document.fullscreenElement === options.host.value; }
|
|
387
|
+
function addFullscreenListener() { if (typeof document !== 'undefined')
|
|
388
|
+
document.addEventListener('fullscreenchange', onFullscreenChange); }
|
|
389
|
+
function removeFullscreenListener() { if (typeof document !== 'undefined')
|
|
390
|
+
document.removeEventListener('fullscreenchange', onFullscreenChange); }
|
|
391
|
+
onMounted(async () => { addFullscreenListener(); await initialize(); });
|
|
392
|
+
onBeforeUnmount(() => { void dispose(); });
|
|
393
|
+
watch(() => [options.options.value.quality, options.options.value.environment, options.options.value.background, options.options.value.shadows, options.options.value.exposure], ([quality, environment, background, shadows, exposure]) => {
|
|
394
|
+
if (!runtime)
|
|
395
|
+
return;
|
|
396
|
+
runtime.visuals.setQuality(quality);
|
|
397
|
+
runtime.visuals.setEnvironment(environment);
|
|
398
|
+
runtime.visuals.setBackground(options.options.value.transparent ? [0, 0, 0, 0] : background);
|
|
399
|
+
runtime.visuals.setShadows(shadows);
|
|
400
|
+
runtime.visuals.setExposure(exposure);
|
|
401
|
+
});
|
|
402
|
+
watch(() => [options.options.value.navigation, options.options.value.autoRotate, options.options.value.autoRotateSpeed], ([navigation, autoRotate, autoRotateSpeed]) => {
|
|
403
|
+
if (!runtime)
|
|
404
|
+
return;
|
|
405
|
+
runtime.navigation.setEnabled(navigation);
|
|
406
|
+
runtime.navigation.setAutoRotate(autoRotate);
|
|
407
|
+
runtime.navigation.setAutoRotateSpeed(autoRotateSpeed);
|
|
408
|
+
});
|
|
409
|
+
let creationSignature = creationKey(options.options.value);
|
|
410
|
+
watch(() => creationKey(options.options.value), (key) => {
|
|
411
|
+
if (key === creationSignature)
|
|
412
|
+
return;
|
|
413
|
+
creationSignature = key;
|
|
414
|
+
void recreate();
|
|
415
|
+
});
|
|
416
|
+
function requireSceneManager() { if (!sceneManager)
|
|
417
|
+
throw new Error(fatalError.value || 'Scene manager is not ready.'); return sceneManager; }
|
|
418
|
+
async function requireRuntime() { if (!runtime)
|
|
419
|
+
await initialize(); if (!runtime)
|
|
420
|
+
throw new Error(fatalError.value || 'Avatar viewer is not ready.'); return runtime; }
|
|
421
|
+
function requireRuntimeSync() { if (!runtime)
|
|
422
|
+
throw new Error(fatalError.value || 'Avatar viewer is not ready.'); return runtime; }
|
|
423
|
+
return {
|
|
424
|
+
handle,
|
|
425
|
+
viewerState,
|
|
426
|
+
cameraState,
|
|
427
|
+
recoveryState,
|
|
428
|
+
publicState,
|
|
429
|
+
ready,
|
|
430
|
+
hasModel,
|
|
431
|
+
isPlaying,
|
|
432
|
+
backend,
|
|
433
|
+
diagnostic,
|
|
434
|
+
fatalError,
|
|
435
|
+
fullscreen,
|
|
436
|
+
sceneModels,
|
|
437
|
+
initialize,
|
|
438
|
+
};
|
|
439
|
+
}
|
|
440
|
+
function creationKey(value) {
|
|
441
|
+
const recovery = typeof value.recovery === 'object' ? `r:${value.recovery.maxAttempts ?? ''}` : String(value.recovery);
|
|
442
|
+
return [value.backend, value.transparent, value.pixelRatio ?? '', value.maxPixelRatio, value.pointerPan, value.autoFit,
|
|
443
|
+
value.normalization, value.targetHeight ?? '', recovery, value.vrma.unmappedNodes ?? '', value.vrma.unsupportedFeatures ?? '', value.vrma.bakeRate ?? ''].join('|');
|
|
444
|
+
}
|
|
445
|
+
function createPicker(accept, onFile) {
|
|
446
|
+
const input = document.createElement('input');
|
|
447
|
+
input.type = 'file';
|
|
448
|
+
input.accept = accept;
|
|
449
|
+
input.hidden = true;
|
|
450
|
+
input.addEventListener('change', () => { const file = input.files?.[0]; input.value = ''; void onFile(file); });
|
|
451
|
+
document.body.appendChild(input);
|
|
452
|
+
return input;
|
|
453
|
+
}
|
|
454
|
+
//# sourceMappingURL=useAnyoAvatarViewer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAnyoAvatarViewer.js","sourceRoot":"","sources":["../src/useAnyoAvatarViewer.ts"],"names":[],"mappings":"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"}
|
package/docs/API.md
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Vue API
|
|
2
|
+
|
|
3
|
+
## Component
|
|
4
|
+
|
|
5
|
+
```vue
|
|
6
|
+
<AnyoAvatarViewer
|
|
7
|
+
preset="portfolio"
|
|
8
|
+
model="/me.vrm"
|
|
9
|
+
animation="/idle.vrma"
|
|
10
|
+
autoplay
|
|
11
|
+
transparent
|
|
12
|
+
/>
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
The exposed component handle mirrors the framework-neutral viewer plus Vue host-scene helpers.
|
|
16
|
+
|
|
17
|
+
## Primary avatar
|
|
18
|
+
|
|
19
|
+
`loadModel`, `loadModelFile`, `loadAnimation`, `loadAnimationFile`, `play`, `pause`, `resume`, `stop`, `seek`, `setSpeed`, `setExpression`, `setLookAt`, camera/navigation methods, visual controls, recovery, screenshot and fullscreen are available through the template ref.
|
|
20
|
+
|
|
21
|
+
## Scene props
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
await viewer.value?.loadProp('/models/desk.glb', {
|
|
25
|
+
id: 'desk',
|
|
26
|
+
position: [0, 0, -0.8],
|
|
27
|
+
rotation: [0, 180, 0],
|
|
28
|
+
scale: 1,
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
await viewer.value?.loadPropAnimation('desk', {
|
|
32
|
+
src: '/animations/desk-idle.glb',
|
|
33
|
+
clip: 'Idle',
|
|
34
|
+
autoplay: true,
|
|
35
|
+
loop: 'repeat',
|
|
36
|
+
})
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Available scene methods:
|
|
40
|
+
|
|
41
|
+
- `loadScene(config, { replace? })`
|
|
42
|
+
- `loadProp(input, config?)` / `loadPropFile(file, config?)`
|
|
43
|
+
- `loadPropAnimation(id, config)` / `loadPropAnimationFile(id, file, config?)`
|
|
44
|
+
- `playProp`, `pauseProp`, `resumeProp`, `stopProp`
|
|
45
|
+
- `updateProp(id, { position?, rotation?, scale?, visible? })`
|
|
46
|
+
- `setPropVisible`, `removeProp`, `clearProps`
|
|
47
|
+
|
|
48
|
+
`state.sceneModels` exposes immutable snapshots of each prop's transform, clips, current clip and playback state.
|
|
49
|
+
|
|
50
|
+
## Declarative JSON scene
|
|
51
|
+
|
|
52
|
+
```ts
|
|
53
|
+
const scene = {
|
|
54
|
+
version: 1,
|
|
55
|
+
props: [
|
|
56
|
+
{
|
|
57
|
+
id: 'computer',
|
|
58
|
+
src: '/models/computer.glb',
|
|
59
|
+
position: [0.65, 0.75, -0.8],
|
|
60
|
+
rotation: [0, -25, 0],
|
|
61
|
+
scale: 0.9,
|
|
62
|
+
animations: [
|
|
63
|
+
{ src: '/animations/computer.glb', clip: 'Screen', autoplay: true }
|
|
64
|
+
],
|
|
65
|
+
},
|
|
66
|
+
],
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Pass it as `:scene="scene"` or call `loadScene(scene)`.
|
|
71
|
+
|
|
72
|
+
## Transparent output
|
|
73
|
+
|
|
74
|
+
Set `transparent` or use `preset="portfolio"`. The runtime is recreated with an alpha-capable renderer when transparency changes, and the clear color is forced to alpha zero. The surrounding page/card remains responsible for the visible background.
|
|
75
|
+
|
|
76
|
+
## Slots/events
|
|
77
|
+
|
|
78
|
+
Scoped slots receive `{ api, state, viewer, camera, recovery }`. Events include `ready`, `state-change`, `camera-change`, `recovery-change`, `diagnostic`, `error`, `model-loaded`, `animation-loaded`, `scene-change`, `prop-loaded`, and `prop-animation-loaded`.
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# High-end scene props
|
|
2
|
+
|
|
3
|
+
`@blcklab/anyo-avatar-vue` delegates prop rendering to Sekai64's native glTF pipeline. The Vue layer does not flatten models or convert materials.
|
|
4
|
+
|
|
5
|
+
## Supported through Sekai64 0.8.0-rc.33
|
|
6
|
+
|
|
7
|
+
- binary GLB and URL-backed glTF
|
|
8
|
+
- nested node hierarchies and multiple meshes/primitives
|
|
9
|
+
- PBR materials plus Sekai64's documented glTF material extensions
|
|
10
|
+
- base-color/normal and other supported texture slots
|
|
11
|
+
- WebP textures
|
|
12
|
+
- vertex colors, alpha mask/blend, double-sided materials and authored samplers
|
|
13
|
+
- sparse accessors
|
|
14
|
+
- skins and morph targets
|
|
15
|
+
- embedded glTF animation and same-rig external GLB/glTF animation
|
|
16
|
+
- browser Draco auto-decoding for `KHR_draco_mesh_compression`
|
|
17
|
+
- repeated-static-mesh batching when a prop is loaded with `load.mode: 'static'`
|
|
18
|
+
- cast/receive-shadow policy per prop
|
|
19
|
+
- shared asset caching across all props in one viewer instance
|
|
20
|
+
|
|
21
|
+
## Load modes
|
|
22
|
+
|
|
23
|
+
Use `animated` for anything that needs clips, skin/morph animation, or may receive an external animation later.
|
|
24
|
+
|
|
25
|
+
Use `static` for architecture, furniture, vegetation, room shells, machinery that never moves, and other heavy environment geometry. Static mode omits the animation adapter and lets Sekai64 batch repeated static sibling meshes.
|
|
26
|
+
|
|
27
|
+
```ts
|
|
28
|
+
const scene = {
|
|
29
|
+
version: 1,
|
|
30
|
+
defaults: {
|
|
31
|
+
load: {
|
|
32
|
+
draco: 'auto',
|
|
33
|
+
retries: 1,
|
|
34
|
+
cache: true,
|
|
35
|
+
texture: { maxBytes: 64 * 1024 * 1024, maxDimension: 8192 },
|
|
36
|
+
},
|
|
37
|
+
render: { castShadow: true, receiveShadow: true },
|
|
38
|
+
},
|
|
39
|
+
props: [
|
|
40
|
+
{
|
|
41
|
+
id: 'room',
|
|
42
|
+
src: '/models/room.glb',
|
|
43
|
+
load: { mode: 'static', staticBatching: { minInstances: 3 } },
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
id: 'machine',
|
|
47
|
+
src: '/models/machine.glb',
|
|
48
|
+
load: { mode: 'animated' },
|
|
49
|
+
animations: [{ clip: 'Idle', autoplay: true }],
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Loading feedback
|
|
56
|
+
|
|
57
|
+
Large model downloads can be surfaced with `prop-progress`; glTF warnings/errors can be surfaced with `prop-diagnostic`.
|
|
58
|
+
|
|
59
|
+
## Limits inherited from Sekai64 rc.33
|
|
60
|
+
|
|
61
|
+
This package does not claim support beyond the renderer. Meshopt and KTX2/Basis use separate host-injected Sekai64 bridge packages and are not wired into this Vue scene API in alpha.2. glTF cubic-spline animation is not supported. Texture-slot coverage for some advanced glTF material extensions is incomplete. Animated/skinned deformation is CPU-based in rc.33, so extremely complex animated props can become CPU-bound.
|
|
62
|
+
|
|
63
|
+
For large production scenes, prefer static mode for non-moving environment assets, compressed geometry where supported, sensible texture sizes, and separate animated props only where motion is needed.
|
package/docs/PRESETS.md
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Presets
|
|
2
|
+
|
|
3
|
+
Presets are defaults, not hard modes. Every option can be overridden on the component.
|
|
4
|
+
|
|
5
|
+
| Preset | Controls | Transparent | Typical use |
|
|
6
|
+
| --- | --- | --- | --- |
|
|
7
|
+
| `bare` | none | no | fully custom host UI |
|
|
8
|
+
| `portfolio` | none | yes | avatar embedded in a card/hero |
|
|
9
|
+
| `viewer` | minimal | no | interactive model viewer |
|
|
10
|
+
| `studio` | full | no | inspection, manual loading and authoring |
|
|
11
|
+
|
|
12
|
+
All presets use the same `@blcklab/anyo-avatar-viewer` runtime and can use scene props. `portfolio` defaults to a transparent alpha canvas so the host card supplies the background.
|
|
13
|
+
|
|
14
|
+
Quality values are `sekai-viewer`, `character`, `ultra`, `balanced`, and `performance`. In core `0.2.0-alpha.8`, the tunable character/balanced/ultra profiles retain character-quality AA/IBL/shadows while avoiding the extra global inverted-hull outline pass that can create oversized silhouettes on some VRMs. `sekai-viewer` remains the exact reference presentation path.
|