@aura3d/engine 1.0.9 → 1.0.10
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 +15 -15
- package/dist/animation/AnimationController.d.ts +1 -0
- package/dist/animation/AnimationController.d.ts.map +1 -1
- package/dist/animation/AnimationController.js +7 -0
- package/dist/animation/AnimationController.js.map +1 -1
- package/dist/audio/AudioFileManager.d.ts +54 -0
- package/dist/audio/AudioFileManager.d.ts.map +1 -0
- package/dist/audio/AudioFileManager.js +108 -0
- package/dist/audio/AudioFileManager.js.map +1 -0
- package/dist/audio/AudioTimelineTrack.d.ts +110 -0
- package/dist/audio/AudioTimelineTrack.d.ts.map +1 -0
- package/dist/audio/AudioTimelineTrack.js +297 -0
- package/dist/audio/AudioTimelineTrack.js.map +1 -0
- package/dist/audio/AudioWaveform.d.ts +42 -0
- package/dist/audio/AudioWaveform.d.ts.map +1 -0
- package/dist/audio/AudioWaveform.js +128 -0
- package/dist/audio/AudioWaveform.js.map +1 -0
- package/dist/audio/index.d.ts +6 -0
- package/dist/audio/index.d.ts.map +1 -1
- package/dist/audio/index.js +3 -0
- package/dist/audio/index.js.map +1 -1
- package/dist/aura3d-cli/cartoon-asset-profiles.d.ts +14 -0
- package/dist/aura3d-cli/cartoon-asset-profiles.d.ts.map +1 -0
- package/dist/aura3d-cli/cartoon-asset-profiles.js +42 -0
- package/dist/aura3d-cli/cartoon-asset-profiles.js.map +1 -0
- package/dist/aura3d-cli/cli.js +16 -6
- package/dist/aura3d-cli/cli.js.map +1 -1
- package/dist/aura3d-cli/game-asset-profiles.d.ts +13 -0
- package/dist/aura3d-cli/game-asset-profiles.d.ts.map +1 -0
- package/dist/aura3d-cli/game-asset-profiles.js +36 -0
- package/dist/aura3d-cli/game-asset-profiles.js.map +1 -0
- package/dist/aura3d-cli/game-asset-validator.d.ts +9 -0
- package/dist/aura3d-cli/game-asset-validator.d.ts.map +1 -0
- package/dist/aura3d-cli/game-asset-validator.js +5 -0
- package/dist/aura3d-cli/game-asset-validator.js.map +1 -0
- package/dist/aura3d-cli/index.d.ts +2 -0
- package/dist/aura3d-cli/index.d.ts.map +1 -1
- package/dist/aura3d-cli/index.js +1 -0
- package/dist/aura3d-cli/index.js.map +1 -1
- package/dist/aura3d-cli/pull-bridge.d.ts +3 -3
- package/dist/aura3d-cli/pull-bridge.d.ts.map +1 -1
- package/dist/aura3d-cli/pull-bridge.js +52 -21
- package/dist/aura3d-cli/pull-bridge.js.map +1 -1
- package/dist/create-aura3d/index.d.ts +1 -1
- package/dist/create-aura3d/index.d.ts.map +1 -1
- package/dist/create-aura3d/index.js +4 -2
- package/dist/create-aura3d/index.js.map +1 -1
- package/dist/editor-runtime/AssetDropZone.d.ts +50 -0
- package/dist/editor-runtime/AssetDropZone.d.ts.map +1 -0
- package/dist/editor-runtime/AssetDropZone.js +101 -0
- package/dist/editor-runtime/AssetDropZone.js.map +1 -0
- package/dist/editor-runtime/CartoonSceneEditor.d.ts +87 -0
- package/dist/editor-runtime/CartoonSceneEditor.d.ts.map +1 -0
- package/dist/editor-runtime/CartoonSceneEditor.js +252 -0
- package/dist/editor-runtime/CartoonSceneEditor.js.map +1 -0
- package/dist/editor-runtime/CurveEditor.d.ts +38 -0
- package/dist/editor-runtime/CurveEditor.d.ts.map +1 -0
- package/dist/editor-runtime/CurveEditor.js +112 -0
- package/dist/editor-runtime/CurveEditor.js.map +1 -0
- package/dist/editor-runtime/KeyframeEditor.d.ts +49 -0
- package/dist/editor-runtime/KeyframeEditor.d.ts.map +1 -0
- package/dist/editor-runtime/KeyframeEditor.js +161 -0
- package/dist/editor-runtime/KeyframeEditor.js.map +1 -0
- package/dist/editor-runtime/PropertyPanel.d.ts +21 -0
- package/dist/editor-runtime/PropertyPanel.d.ts.map +1 -0
- package/dist/editor-runtime/PropertyPanel.js +72 -0
- package/dist/editor-runtime/PropertyPanel.js.map +1 -0
- package/dist/editor-runtime/SceneOutliner.d.ts +19 -0
- package/dist/editor-runtime/SceneOutliner.d.ts.map +1 -0
- package/dist/editor-runtime/SceneOutliner.js +64 -0
- package/dist/editor-runtime/SceneOutliner.js.map +1 -0
- package/dist/editor-runtime/TimelineEditorController.d.ts +92 -0
- package/dist/editor-runtime/TimelineEditorController.d.ts.map +1 -0
- package/dist/editor-runtime/TimelineEditorController.js +424 -0
- package/dist/editor-runtime/TimelineEditorController.js.map +1 -0
- package/dist/editor-runtime/TimelineTrackTypes.d.ts +25 -0
- package/dist/editor-runtime/TimelineTrackTypes.d.ts.map +1 -0
- package/dist/editor-runtime/TimelineTrackTypes.js +48 -0
- package/dist/editor-runtime/TimelineTrackTypes.js.map +1 -0
- package/dist/editor-runtime/TimelineUI.d.ts +27 -0
- package/dist/editor-runtime/TimelineUI.d.ts.map +1 -0
- package/dist/editor-runtime/TimelineUI.js +118 -0
- package/dist/editor-runtime/TimelineUI.js.map +1 -0
- package/dist/editor-runtime/index.d.ts +18 -0
- package/dist/editor-runtime/index.d.ts.map +1 -1
- package/dist/editor-runtime/index.js +9 -0
- package/dist/editor-runtime/index.js.map +1 -1
- package/dist/engine/advanced-runtime/A3DRenderer.d.ts +24 -2
- package/dist/engine/advanced-runtime/A3DRenderer.d.ts.map +1 -1
- package/dist/engine/advanced-runtime/A3DRenderer.js +70 -9
- package/dist/engine/advanced-runtime/A3DRenderer.js.map +1 -1
- package/dist/engine/agent-api/AssetLibraryBrowser.d.ts +39 -0
- package/dist/engine/agent-api/AssetLibraryBrowser.d.ts.map +1 -0
- package/dist/engine/agent-api/AssetLibraryBrowser.js +60 -0
- package/dist/engine/agent-api/AssetLibraryBrowser.js.map +1 -0
- package/dist/engine/agent-api/AudioMuxer.d.ts +68 -0
- package/dist/engine/agent-api/AudioMuxer.d.ts.map +1 -0
- package/dist/engine/agent-api/AudioMuxer.js +74 -0
- package/dist/engine/agent-api/AudioMuxer.js.map +1 -0
- package/dist/engine/agent-api/AudioVisemeAnalyzer.d.ts +43 -0
- package/dist/engine/agent-api/AudioVisemeAnalyzer.d.ts.map +1 -0
- package/dist/engine/agent-api/AudioVisemeAnalyzer.js +110 -0
- package/dist/engine/agent-api/AudioVisemeAnalyzer.js.map +1 -0
- package/dist/engine/agent-api/BodyLanguageLibrary.d.ts +4 -0
- package/dist/engine/agent-api/BodyLanguageLibrary.d.ts.map +1 -0
- package/dist/engine/agent-api/BodyLanguageLibrary.js +10 -0
- package/dist/engine/agent-api/BodyLanguageLibrary.js.map +1 -0
- package/dist/engine/agent-api/CameraChoreographer.d.ts +69 -0
- package/dist/engine/agent-api/CameraChoreographer.d.ts.map +1 -0
- package/dist/engine/agent-api/CameraChoreographer.js +165 -0
- package/dist/engine/agent-api/CameraChoreographer.js.map +1 -0
- package/dist/engine/agent-api/CameraPathEditor.d.ts +20 -0
- package/dist/engine/agent-api/CameraPathEditor.d.ts.map +1 -0
- package/dist/engine/agent-api/CameraPathEditor.js +47 -0
- package/dist/engine/agent-api/CameraPathEditor.js.map +1 -0
- package/dist/engine/agent-api/CameraPresetLibrary.d.ts +22 -0
- package/dist/engine/agent-api/CameraPresetLibrary.d.ts.map +1 -0
- package/dist/engine/agent-api/CameraPresetLibrary.js +91 -0
- package/dist/engine/agent-api/CameraPresetLibrary.js.map +1 -0
- package/dist/engine/agent-api/CaptionExporter.d.ts +19 -0
- package/dist/engine/agent-api/CaptionExporter.d.ts.map +1 -0
- package/dist/engine/agent-api/CaptionExporter.js +54 -0
- package/dist/engine/agent-api/CaptionExporter.js.map +1 -0
- package/dist/engine/agent-api/CartoonAssetManifest.d.ts +32 -0
- package/dist/engine/agent-api/CartoonAssetManifest.d.ts.map +1 -0
- package/dist/engine/agent-api/CartoonAssetManifest.js +4 -0
- package/dist/engine/agent-api/CartoonAssetManifest.js.map +1 -0
- package/dist/engine/agent-api/DialogueAlignment.d.ts +18 -0
- package/dist/engine/agent-api/DialogueAlignment.d.ts.map +1 -0
- package/dist/engine/agent-api/DialogueAlignment.js +23 -0
- package/dist/engine/agent-api/DialogueAlignment.js.map +1 -0
- package/dist/engine/agent-api/EpisodeStructure.d.ts +77 -0
- package/dist/engine/agent-api/EpisodeStructure.d.ts.map +1 -0
- package/dist/engine/agent-api/EpisodeStructure.js +123 -0
- package/dist/engine/agent-api/EpisodeStructure.js.map +1 -0
- package/dist/engine/agent-api/EpisodeTemplates.d.ts +13 -0
- package/dist/engine/agent-api/EpisodeTemplates.d.ts.map +1 -0
- package/dist/engine/agent-api/EpisodeTemplates.js +14 -0
- package/dist/engine/agent-api/EpisodeTemplates.js.map +1 -0
- package/dist/engine/agent-api/FrameEncoder.d.ts +62 -0
- package/dist/engine/agent-api/FrameEncoder.d.ts.map +1 -0
- package/dist/engine/agent-api/FrameEncoder.js +117 -0
- package/dist/engine/agent-api/FrameEncoder.js.map +1 -0
- package/dist/engine/agent-api/GameEvidence.d.ts +43 -0
- package/dist/engine/agent-api/GameEvidence.d.ts.map +1 -1
- package/dist/engine/agent-api/GameEvidence.js +30 -1
- package/dist/engine/agent-api/GameEvidence.js.map +1 -1
- package/dist/engine/agent-api/GameInspector.d.ts +65 -0
- package/dist/engine/agent-api/GameInspector.d.ts.map +1 -0
- package/dist/engine/agent-api/GameInspector.js +53 -0
- package/dist/engine/agent-api/GameInspector.js.map +1 -0
- package/dist/engine/agent-api/GameRuntime.d.ts +67 -1
- package/dist/engine/agent-api/GameRuntime.d.ts.map +1 -1
- package/dist/engine/agent-api/GameRuntime.js +191 -7
- package/dist/engine/agent-api/GameRuntime.js.map +1 -1
- package/dist/engine/agent-api/PerformanceBlender.d.ts +11 -0
- package/dist/engine/agent-api/PerformanceBlender.d.ts.map +1 -0
- package/dist/engine/agent-api/PerformanceBlender.js +29 -0
- package/dist/engine/agent-api/PerformanceBlender.js.map +1 -0
- package/dist/engine/agent-api/PerformancePoseEditor.d.ts +21 -0
- package/dist/engine/agent-api/PerformancePoseEditor.d.ts.map +1 -0
- package/dist/engine/agent-api/PerformancePoseEditor.js +23 -0
- package/dist/engine/agent-api/PerformancePoseEditor.js.map +1 -0
- package/dist/engine/agent-api/PerformanceScriptParser.d.ts +9 -0
- package/dist/engine/agent-api/PerformanceScriptParser.d.ts.map +1 -0
- package/dist/engine/agent-api/PerformanceScriptParser.js +16 -0
- package/dist/engine/agent-api/PerformanceScriptParser.js.map +1 -0
- package/dist/engine/agent-api/PublishingPipeline.d.ts +57 -0
- package/dist/engine/agent-api/PublishingPipeline.d.ts.map +1 -0
- package/dist/engine/agent-api/PublishingPipeline.js +67 -0
- package/dist/engine/agent-api/PublishingPipeline.js.map +1 -0
- package/dist/engine/agent-api/RenderProgressTracker.d.ts +49 -0
- package/dist/engine/agent-api/RenderProgressTracker.d.ts.map +1 -0
- package/dist/engine/agent-api/RenderProgressTracker.js +106 -0
- package/dist/engine/agent-api/RenderProgressTracker.js.map +1 -0
- package/dist/engine/agent-api/RuntimeNodeHandle.d.ts +50 -0
- package/dist/engine/agent-api/RuntimeNodeHandle.d.ts.map +1 -1
- package/dist/engine/agent-api/RuntimeNodeHandle.js +48 -0
- package/dist/engine/agent-api/RuntimeNodeHandle.js.map +1 -1
- package/dist/engine/agent-api/SceneSequencer.d.ts +54 -0
- package/dist/engine/agent-api/SceneSequencer.d.ts.map +1 -0
- package/dist/engine/agent-api/SceneSequencer.js +64 -0
- package/dist/engine/agent-api/SceneSequencer.js.map +1 -0
- package/dist/engine/agent-api/ShotCompositionRules.d.ts +45 -0
- package/dist/engine/agent-api/ShotCompositionRules.d.ts.map +1 -0
- package/dist/engine/agent-api/ShotCompositionRules.js +54 -0
- package/dist/engine/agent-api/ShotCompositionRules.js.map +1 -0
- package/dist/engine/agent-api/ShotTransitionEngine.d.ts +46 -0
- package/dist/engine/agent-api/ShotTransitionEngine.d.ts.map +1 -0
- package/dist/engine/agent-api/ShotTransitionEngine.js +98 -0
- package/dist/engine/agent-api/ShotTransitionEngine.js.map +1 -0
- package/dist/engine/agent-api/ThumbnailGenerator.d.ts +44 -0
- package/dist/engine/agent-api/ThumbnailGenerator.d.ts.map +1 -0
- package/dist/engine/agent-api/ThumbnailGenerator.js +82 -0
- package/dist/engine/agent-api/ThumbnailGenerator.js.map +1 -0
- package/dist/engine/agent-api/VideoExportPipeline.d.ts +66 -0
- package/dist/engine/agent-api/VideoExportPipeline.d.ts.map +1 -0
- package/dist/engine/agent-api/VideoExportPipeline.js +108 -0
- package/dist/engine/agent-api/VideoExportPipeline.js.map +1 -0
- package/dist/engine/agent-api/VisemeTimelineTrack.d.ts +29 -0
- package/dist/engine/agent-api/VisemeTimelineTrack.d.ts.map +1 -0
- package/dist/engine/agent-api/VisemeTimelineTrack.js +34 -0
- package/dist/engine/agent-api/VisemeTimelineTrack.js.map +1 -0
- package/dist/engine/agent-api/WaveformVisualizer.d.ts +61 -0
- package/dist/engine/agent-api/WaveformVisualizer.d.ts.map +1 -0
- package/dist/engine/agent-api/WaveformVisualizer.js +108 -0
- package/dist/engine/agent-api/WaveformVisualizer.js.map +1 -0
- package/dist/engine/agent-api/YouTubeMetadataGenerator.d.ts +21 -0
- package/dist/engine/agent-api/YouTubeMetadataGenerator.d.ts.map +1 -0
- package/dist/engine/agent-api/YouTubeMetadataGenerator.js +51 -0
- package/dist/engine/agent-api/YouTubeMetadataGenerator.js.map +1 -0
- package/dist/engine/agent-api/game-kits/fighting.d.ts +20 -0
- package/dist/engine/agent-api/game-kits/fighting.d.ts.map +1 -1
- package/dist/engine/agent-api/game-kits/fighting.js +20 -0
- package/dist/engine/agent-api/game-kits/fighting.js.map +1 -1
- package/dist/engine/agent-api/index.d.ts +92 -3
- package/dist/engine/agent-api/index.d.ts.map +1 -1
- package/dist/engine/agent-api/index.js +116 -2
- package/dist/engine/agent-api/index.js.map +1 -1
- package/dist/engine/agent-api/product-viewer-runtime.d.ts.map +1 -1
- package/dist/engine/game/GameAudio.d.ts +65 -0
- package/dist/engine/game/GameAudio.d.ts.map +1 -0
- package/dist/engine/game/GameAudio.js +155 -0
- package/dist/engine/game/GameAudio.js.map +1 -0
- package/dist/engine/game/index.d.ts +3 -0
- package/dist/engine/game/index.d.ts.map +1 -0
- package/dist/engine/game/index.js +2 -0
- package/dist/engine/game/index.js.map +1 -0
- package/dist/engine/index.d.ts +2 -0
- package/dist/engine/index.d.ts.map +1 -1
- package/dist/engine/index.js +2 -0
- package/dist/engine/index.js.map +1 -1
- package/dist/engine/production-runtime/GameAppRuntime.d.ts +3 -0
- package/dist/engine/production-runtime/GameAppRuntime.d.ts.map +1 -0
- package/dist/engine/production-runtime/GameAppRuntime.js +2 -0
- package/dist/engine/production-runtime/GameAppRuntime.js.map +1 -0
- package/dist/engine/production-runtime/GameRenderPreset.d.ts +55 -0
- package/dist/engine/production-runtime/GameRenderPreset.d.ts.map +1 -0
- package/dist/engine/production-runtime/GameRenderPreset.js +90 -0
- package/dist/engine/production-runtime/GameRenderPreset.js.map +1 -0
- package/dist/engine/production-runtime/index.d.ts +18 -1
- package/dist/engine/production-runtime/index.d.ts.map +1 -1
- package/dist/engine/production-runtime/index.js +35 -1
- package/dist/engine/production-runtime/index.js.map +1 -1
- package/dist/engine/runtime/AssetPreloader.d.ts +14 -0
- package/dist/engine/runtime/AssetPreloader.d.ts.map +1 -0
- package/dist/engine/runtime/AssetPreloader.js +22 -0
- package/dist/engine/runtime/AssetPreloader.js.map +1 -0
- package/dist/engine/runtime/ResourceManager.d.ts +48 -0
- package/dist/engine/runtime/ResourceManager.d.ts.map +1 -0
- package/dist/engine/runtime/ResourceManager.js +156 -0
- package/dist/engine/runtime/ResourceManager.js.map +1 -0
- package/dist/engine/runtime/index.d.ts +5 -0
- package/dist/engine/runtime/index.d.ts.map +1 -0
- package/dist/engine/runtime/index.js +3 -0
- package/dist/engine/runtime/index.js.map +1 -0
- package/dist/physics/CharacterController.d.ts +31 -0
- package/dist/physics/CharacterController.d.ts.map +1 -1
- package/dist/physics/CharacterController.js +90 -0
- package/dist/physics/CharacterController.js.map +1 -1
- package/dist/physics/CollisionVolumes.d.ts +29 -0
- package/dist/physics/CollisionVolumes.d.ts.map +1 -1
- package/dist/physics/CollisionVolumes.js +43 -0
- package/dist/physics/CollisionVolumes.js.map +1 -1
- package/dist/physics/KinematicBody.d.ts +15 -0
- package/dist/physics/KinematicBody.d.ts.map +1 -1
- package/dist/physics/KinematicBody.js +28 -0
- package/dist/physics/KinematicBody.js.map +1 -1
- package/dist/physics/KinematicWorld.js +6 -0
- package/dist/physics/KinematicWorld.js.map +1 -1
- package/dist/scripting/CartoonNodeCategories.d.ts +3 -0
- package/dist/scripting/CartoonNodeCategories.d.ts.map +1 -0
- package/dist/scripting/CartoonNodeCategories.js +9 -0
- package/dist/scripting/CartoonNodeCategories.js.map +1 -0
- package/dist/scripting/CartoonVisualNodes.d.ts +3 -0
- package/dist/scripting/CartoonVisualNodes.d.ts.map +1 -0
- package/dist/scripting/CartoonVisualNodes.js +41 -0
- package/dist/scripting/CartoonVisualNodes.js.map +1 -0
- package/dist/scripting/VisualGraphExecutor.js +46 -0
- package/dist/scripting/VisualGraphExecutor.js.map +1 -1
- package/dist/scripting/VisualNodeCatalog.d.ts +1 -1
- package/dist/scripting/VisualNodeCatalog.d.ts.map +1 -1
- package/dist/scripting/VisualNodeCatalog.js +3 -1
- package/dist/scripting/VisualNodeCatalog.js.map +1 -1
- package/dist/scripting/index.d.ts +3 -0
- package/dist/scripting/index.d.ts.map +1 -1
- package/dist/scripting/index.js +2 -0
- package/dist/scripting/index.js.map +1 -1
- package/package.json +119 -119
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
export class AudioTimelineTrack {
|
|
2
|
+
id;
|
|
3
|
+
name;
|
|
4
|
+
role;
|
|
5
|
+
busName;
|
|
6
|
+
volume;
|
|
7
|
+
muted;
|
|
8
|
+
solo;
|
|
9
|
+
clipsRef = [];
|
|
10
|
+
constructor(options) {
|
|
11
|
+
this.id = nonEmpty(options.id, "Audio timeline track id");
|
|
12
|
+
this.name = options.name ?? options.id;
|
|
13
|
+
this.role = options.role;
|
|
14
|
+
this.busName = options.busName ?? defaultAudioTimelineBusForRole(options.role);
|
|
15
|
+
this.volume = validateVolume(options.volume ?? 1, "Audio timeline track volume");
|
|
16
|
+
this.muted = options.muted ?? false;
|
|
17
|
+
this.solo = options.solo ?? false;
|
|
18
|
+
for (const clip of options.clips ?? []) {
|
|
19
|
+
this.addClip(clip);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
get clips() {
|
|
23
|
+
return [...this.clipsRef].sort(compareTimelineClips);
|
|
24
|
+
}
|
|
25
|
+
addClip(options) {
|
|
26
|
+
if (this.clipsRef.some((clip) => clip.id === options.id)) {
|
|
27
|
+
throw new Error(`Audio timeline clip already exists: ${options.id}`);
|
|
28
|
+
}
|
|
29
|
+
const clip = createAudioTimelineClip(options, this.busName);
|
|
30
|
+
this.clipsRef.push(clip);
|
|
31
|
+
this.sortClips();
|
|
32
|
+
return clip;
|
|
33
|
+
}
|
|
34
|
+
getClip(id) {
|
|
35
|
+
const clip = this.clipsRef.find((entry) => entry.id === id);
|
|
36
|
+
if (!clip) {
|
|
37
|
+
throw new Error(`Unknown audio timeline clip: ${id}`);
|
|
38
|
+
}
|
|
39
|
+
return clip;
|
|
40
|
+
}
|
|
41
|
+
removeClip(id) {
|
|
42
|
+
const index = this.clipsRef.findIndex((clip) => clip.id === id);
|
|
43
|
+
if (index < 0) {
|
|
44
|
+
throw new Error(`Unknown audio timeline clip: ${id}`);
|
|
45
|
+
}
|
|
46
|
+
const [removed] = this.clipsRef.splice(index, 1);
|
|
47
|
+
return removed;
|
|
48
|
+
}
|
|
49
|
+
moveClip(id, startTime) {
|
|
50
|
+
const clip = this.getClip(id);
|
|
51
|
+
const updated = { ...clip, startTime: validateNonNegative(startTime, "Audio timeline clip startTime") };
|
|
52
|
+
this.replaceClip(updated);
|
|
53
|
+
return updated;
|
|
54
|
+
}
|
|
55
|
+
trimClip(id, trimStart, trimEnd) {
|
|
56
|
+
const clip = this.getClip(id);
|
|
57
|
+
const sourceDuration = clip.sourceDuration;
|
|
58
|
+
const nextTrimStart = validateNonNegative(trimStart, "Audio timeline clip trimStart");
|
|
59
|
+
const nextTrimEnd = validateNonNegative(trimEnd, "Audio timeline clip trimEnd");
|
|
60
|
+
if (nextTrimEnd <= nextTrimStart || nextTrimEnd > sourceDuration) {
|
|
61
|
+
throw new Error("Audio timeline trim range must be inside the source duration");
|
|
62
|
+
}
|
|
63
|
+
const updated = {
|
|
64
|
+
...clip,
|
|
65
|
+
trimStart: nextTrimStart,
|
|
66
|
+
trimEnd: nextTrimEnd,
|
|
67
|
+
duration: nextTrimEnd - nextTrimStart,
|
|
68
|
+
envelope: clip.envelope.filter((point) => point.time <= nextTrimEnd - nextTrimStart)
|
|
69
|
+
};
|
|
70
|
+
this.replaceClip(updated);
|
|
71
|
+
return updated;
|
|
72
|
+
}
|
|
73
|
+
splitClip(id, splitTime, rightId = `${id}:split`) {
|
|
74
|
+
const clip = this.getClip(id);
|
|
75
|
+
const split = validateNonNegative(splitTime, "Audio timeline splitTime");
|
|
76
|
+
if (split <= clip.startTime || split >= clip.startTime + clip.duration) {
|
|
77
|
+
throw new Error("Audio timeline splitTime must fall inside the clip");
|
|
78
|
+
}
|
|
79
|
+
if (this.clipsRef.some((entry) => entry.id === rightId)) {
|
|
80
|
+
throw new Error(`Audio timeline clip already exists: ${rightId}`);
|
|
81
|
+
}
|
|
82
|
+
const leftDuration = split - clip.startTime;
|
|
83
|
+
const rightDuration = clip.duration - leftDuration;
|
|
84
|
+
const left = {
|
|
85
|
+
...clip,
|
|
86
|
+
duration: leftDuration,
|
|
87
|
+
trimEnd: clip.trimStart + leftDuration,
|
|
88
|
+
envelope: clip.envelope.filter((point) => point.time <= leftDuration)
|
|
89
|
+
};
|
|
90
|
+
const right = {
|
|
91
|
+
...clip,
|
|
92
|
+
id: rightId,
|
|
93
|
+
startTime: split,
|
|
94
|
+
duration: rightDuration,
|
|
95
|
+
trimStart: clip.trimStart + leftDuration,
|
|
96
|
+
envelope: shiftEnvelope(clip.envelope.filter((point) => point.time >= leftDuration), -leftDuration)
|
|
97
|
+
};
|
|
98
|
+
this.replaceClip(left);
|
|
99
|
+
this.clipsRef.push(right);
|
|
100
|
+
this.sortClips();
|
|
101
|
+
return [left, right];
|
|
102
|
+
}
|
|
103
|
+
activeClipsAt(time) {
|
|
104
|
+
const timelineTime = validateNonNegative(time, "Audio timeline sample time");
|
|
105
|
+
return this.clipsRef.filter((clip) => clipContainsTimelineTime(clip, timelineTime)).sort(compareTimelineClips);
|
|
106
|
+
}
|
|
107
|
+
sampleAt(time) {
|
|
108
|
+
const timelineTime = validateNonNegative(time, "Audio timeline sample time");
|
|
109
|
+
if (this.muted)
|
|
110
|
+
return [];
|
|
111
|
+
return this.activeClipsAt(timelineTime)
|
|
112
|
+
.map((clip) => createTimelineSample(this, clip, timelineTime))
|
|
113
|
+
.filter((sample) => !sample.muted && sample.volume > 0);
|
|
114
|
+
}
|
|
115
|
+
replaceClip(next) {
|
|
116
|
+
const index = this.clipsRef.findIndex((clip) => clip.id === next.id);
|
|
117
|
+
if (index < 0) {
|
|
118
|
+
throw new Error(`Unknown audio timeline clip: ${next.id}`);
|
|
119
|
+
}
|
|
120
|
+
this.clipsRef[index] = next;
|
|
121
|
+
this.sortClips();
|
|
122
|
+
}
|
|
123
|
+
sortClips() {
|
|
124
|
+
this.clipsRef.sort(compareTimelineClips);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
export function defaultAudioTimelineBusForRole(role) {
|
|
128
|
+
if (role === "dialogue")
|
|
129
|
+
return "voice";
|
|
130
|
+
if (role === "sfx")
|
|
131
|
+
return "sfx";
|
|
132
|
+
return role;
|
|
133
|
+
}
|
|
134
|
+
export function createAudioTimelineMixSnapshot(tracks, time, options = {}) {
|
|
135
|
+
const soloTracks = tracks.filter((track) => track.solo);
|
|
136
|
+
const candidateTracks = soloTracks.length > 0 ? soloTracks : tracks;
|
|
137
|
+
const activeSamples = candidateTracks.flatMap((track) => track.sampleAt(time));
|
|
138
|
+
const dialogueActive = activeSamples.some((sample) => sample.role === "dialogue" && sample.volume > 0);
|
|
139
|
+
const duckingApplied = dialogueActive && options.duckMusicDuringDialogue !== false;
|
|
140
|
+
const mutedBuses = new Set(options.mutedBuses ?? []);
|
|
141
|
+
const soloBuses = new Set(options.soloBuses ?? []);
|
|
142
|
+
const hasSoloBus = soloBuses.size > 0;
|
|
143
|
+
const busByName = new Map();
|
|
144
|
+
busByName.set("master", {
|
|
145
|
+
busName: "master",
|
|
146
|
+
role: "master",
|
|
147
|
+
volume: validateVolume(options.masterVolume ?? 1, "Audio timeline master volume"),
|
|
148
|
+
muted: mutedBuses.has("master"),
|
|
149
|
+
solo: soloBuses.has("master"),
|
|
150
|
+
ducked: false
|
|
151
|
+
});
|
|
152
|
+
for (const track of tracks) {
|
|
153
|
+
const configuredVolume = options.busVolumes?.[track.busName] ?? track.volume;
|
|
154
|
+
const ducked = duckingApplied && track.role === "music";
|
|
155
|
+
const volume = validateVolume(configuredVolume, `Audio timeline bus ${track.busName} volume`)
|
|
156
|
+
* (ducked ? validateDuckingRatio(options.duckingRatio ?? 0.35) : 1);
|
|
157
|
+
const muted = track.muted || mutedBuses.has(track.busName) || (hasSoloBus && !soloBuses.has(track.busName));
|
|
158
|
+
busByName.set(track.busName, {
|
|
159
|
+
busName: track.busName,
|
|
160
|
+
role: track.role,
|
|
161
|
+
volume,
|
|
162
|
+
muted,
|
|
163
|
+
solo: soloBuses.has(track.busName),
|
|
164
|
+
ducked
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
return {
|
|
168
|
+
time: validateNonNegative(time, "Audio timeline mix snapshot time"),
|
|
169
|
+
activeSamples: activeSamples.filter((sample) => {
|
|
170
|
+
const bus = busByName.get(sample.busName);
|
|
171
|
+
return bus ? !bus.muted && bus.volume > 0 : true;
|
|
172
|
+
}),
|
|
173
|
+
buses: [...busByName.values()].sort((a, b) => a.busName.localeCompare(b.busName)),
|
|
174
|
+
dialogueActive,
|
|
175
|
+
duckingApplied
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
function createAudioTimelineClip(options, fallbackBusName) {
|
|
179
|
+
const id = nonEmpty(options.id, "Audio timeline clip id");
|
|
180
|
+
const sourceDuration = validateSourceDuration(options);
|
|
181
|
+
const trimStart = validateNonNegative(options.trimStart ?? 0, "Audio timeline clip trimStart");
|
|
182
|
+
const trimEnd = validateNonNegative(options.trimEnd ?? sourceDuration, "Audio timeline clip trimEnd");
|
|
183
|
+
if (trimEnd <= trimStart || trimEnd > sourceDuration) {
|
|
184
|
+
throw new Error("Audio timeline clip trim range must be inside the source duration");
|
|
185
|
+
}
|
|
186
|
+
const duration = validateNonNegative(options.duration ?? (trimEnd - trimStart), "Audio timeline clip duration");
|
|
187
|
+
if (duration <= 0) {
|
|
188
|
+
throw new Error("Audio timeline clip duration must be greater than zero");
|
|
189
|
+
}
|
|
190
|
+
return {
|
|
191
|
+
id,
|
|
192
|
+
...(options.clip ? { clip: options.clip } : {}),
|
|
193
|
+
...(options.assetId ? { assetId: options.assetId } : {}),
|
|
194
|
+
...(options.sourceUrl ? { sourceUrl: options.sourceUrl } : {}),
|
|
195
|
+
...(options.waveform ? { waveform: options.waveform } : {}),
|
|
196
|
+
startTime: validateNonNegative(options.startTime, "Audio timeline clip startTime"),
|
|
197
|
+
duration,
|
|
198
|
+
trimStart,
|
|
199
|
+
trimEnd,
|
|
200
|
+
sourceDuration,
|
|
201
|
+
volume: validateVolume(options.volume ?? 1, "Audio timeline clip volume"),
|
|
202
|
+
muted: options.muted ?? false,
|
|
203
|
+
loop: options.loop ?? false,
|
|
204
|
+
busName: options.busName ?? fallbackBusName,
|
|
205
|
+
envelope: sortEnvelope(options.envelope ?? [])
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
function validateSourceDuration(options) {
|
|
209
|
+
const sourceDuration = options.clip?.duration ?? options.waveform?.duration ?? options.duration;
|
|
210
|
+
if (sourceDuration === undefined) {
|
|
211
|
+
throw new Error("Audio timeline clip requires a clip, waveform, or explicit duration");
|
|
212
|
+
}
|
|
213
|
+
return finitePositive(sourceDuration, "Audio timeline clip source duration");
|
|
214
|
+
}
|
|
215
|
+
function createTimelineSample(track, clip, timelineTime) {
|
|
216
|
+
const localTime = timelineTime - clip.startTime;
|
|
217
|
+
const sourceWindow = clip.trimEnd - clip.trimStart;
|
|
218
|
+
const sourceOffset = clip.loop ? localTime % sourceWindow : Math.min(localTime, sourceWindow);
|
|
219
|
+
const sourceTime = clip.trimStart + sourceOffset;
|
|
220
|
+
return {
|
|
221
|
+
trackId: track.id,
|
|
222
|
+
clipId: clip.id,
|
|
223
|
+
role: track.role,
|
|
224
|
+
busName: clip.busName,
|
|
225
|
+
timelineTime,
|
|
226
|
+
localTime,
|
|
227
|
+
sourceTime,
|
|
228
|
+
volume: track.volume * clip.volume * envelopeValueAt(clip.envelope, localTime),
|
|
229
|
+
muted: track.muted || clip.muted,
|
|
230
|
+
clip
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
function clipContainsTimelineTime(clip, time) {
|
|
234
|
+
return time >= clip.startTime && time < clip.startTime + clip.duration;
|
|
235
|
+
}
|
|
236
|
+
function envelopeValueAt(envelope, time) {
|
|
237
|
+
if (envelope.length === 0)
|
|
238
|
+
return 1;
|
|
239
|
+
if (time <= envelope[0].time)
|
|
240
|
+
return envelope[0].value;
|
|
241
|
+
for (let index = 1; index < envelope.length; index++) {
|
|
242
|
+
const previous = envelope[index - 1];
|
|
243
|
+
const next = envelope[index];
|
|
244
|
+
if (time <= next.time) {
|
|
245
|
+
const span = next.time - previous.time;
|
|
246
|
+
const alpha = span <= 0 ? 0 : (time - previous.time) / span;
|
|
247
|
+
return previous.value + (next.value - previous.value) * alpha;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return envelope[envelope.length - 1].value;
|
|
251
|
+
}
|
|
252
|
+
function sortEnvelope(envelope) {
|
|
253
|
+
return envelope
|
|
254
|
+
.map((point) => ({
|
|
255
|
+
time: validateNonNegative(point.time, "Audio timeline envelope time"),
|
|
256
|
+
value: validateVolume(point.value, "Audio timeline envelope value")
|
|
257
|
+
}))
|
|
258
|
+
.sort((a, b) => a.time - b.time);
|
|
259
|
+
}
|
|
260
|
+
function shiftEnvelope(envelope, delta) {
|
|
261
|
+
return sortEnvelope(envelope.map((point) => ({ ...point, time: Math.max(0, point.time + delta) })));
|
|
262
|
+
}
|
|
263
|
+
function compareTimelineClips(left, right) {
|
|
264
|
+
return left.startTime - right.startTime || left.id.localeCompare(right.id);
|
|
265
|
+
}
|
|
266
|
+
function nonEmpty(value, label) {
|
|
267
|
+
const trimmed = value.trim();
|
|
268
|
+
if (!trimmed) {
|
|
269
|
+
throw new Error(`${label} must be a non-empty string`);
|
|
270
|
+
}
|
|
271
|
+
return trimmed;
|
|
272
|
+
}
|
|
273
|
+
function finitePositive(value, label) {
|
|
274
|
+
if (!Number.isFinite(value) || value <= 0) {
|
|
275
|
+
throw new Error(`${label} must be a positive finite number`);
|
|
276
|
+
}
|
|
277
|
+
return value;
|
|
278
|
+
}
|
|
279
|
+
function validateNonNegative(value, label) {
|
|
280
|
+
if (!Number.isFinite(value) || value < 0) {
|
|
281
|
+
throw new Error(`${label} must be a non-negative finite number`);
|
|
282
|
+
}
|
|
283
|
+
return value;
|
|
284
|
+
}
|
|
285
|
+
function validateVolume(value, label) {
|
|
286
|
+
if (!Number.isFinite(value) || value < 0) {
|
|
287
|
+
throw new Error(`${label} must be a non-negative finite number`);
|
|
288
|
+
}
|
|
289
|
+
return value;
|
|
290
|
+
}
|
|
291
|
+
function validateDuckingRatio(value) {
|
|
292
|
+
if (!Number.isFinite(value) || value < 0 || value > 1) {
|
|
293
|
+
throw new Error("Audio timeline duckingRatio must be between 0 and 1");
|
|
294
|
+
}
|
|
295
|
+
return value;
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=AudioTimelineTrack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AudioTimelineTrack.js","sourceRoot":"","sources":["../../../../packages/audio/src/AudioTimelineTrack.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { AudioClip } from "./AudioClip";
|
|
2
|
+
export interface AudioWaveformOptions {
|
|
3
|
+
readonly peakCount?: number;
|
|
4
|
+
readonly samplesPerPeak?: number;
|
|
5
|
+
readonly channel?: number | "mix";
|
|
6
|
+
readonly normalize?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface AudioWaveformPeak {
|
|
9
|
+
readonly min: number;
|
|
10
|
+
readonly max: number;
|
|
11
|
+
readonly rms: number;
|
|
12
|
+
}
|
|
13
|
+
export interface AudioWaveformData {
|
|
14
|
+
readonly duration: number;
|
|
15
|
+
readonly sampleRate: number;
|
|
16
|
+
readonly channels: number;
|
|
17
|
+
readonly peakCount: number;
|
|
18
|
+
readonly samplesPerPeak: number;
|
|
19
|
+
readonly normalized: boolean;
|
|
20
|
+
readonly peaks: readonly AudioWaveformPeak[];
|
|
21
|
+
}
|
|
22
|
+
export interface AudioWaveformPathPoint {
|
|
23
|
+
readonly x: number;
|
|
24
|
+
readonly yMin: number;
|
|
25
|
+
readonly yMax: number;
|
|
26
|
+
readonly rmsHeight: number;
|
|
27
|
+
}
|
|
28
|
+
export interface AudioWaveformPathOptions {
|
|
29
|
+
readonly width: number;
|
|
30
|
+
readonly height: number;
|
|
31
|
+
readonly padding?: number;
|
|
32
|
+
}
|
|
33
|
+
export type AudioWaveformInput = AudioBuffer | AudioClip;
|
|
34
|
+
export declare function createAudioWaveform(input: AudioWaveformInput, options?: AudioWaveformOptions): AudioWaveformData;
|
|
35
|
+
export declare function sampleAudioWaveformAtTime(waveform: AudioWaveformData, timeSeconds: number): AudioWaveformPeak;
|
|
36
|
+
export declare function createAudioWaveformPath(waveform: AudioWaveformData, options: AudioWaveformPathOptions): readonly AudioWaveformPathPoint[];
|
|
37
|
+
export declare function audioWaveformPeakRange(waveform: AudioWaveformData): {
|
|
38
|
+
readonly min: number;
|
|
39
|
+
readonly max: number;
|
|
40
|
+
readonly rmsMax: number;
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=AudioWaveform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AudioWaveform.d.ts","sourceRoot":"","sources":["../../../../packages/audio/src/AudioWaveform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAC9C;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,SAAS,CAAC;AAEzD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,EAAE,OAAO,GAAE,oBAAyB,GAAG,iBAAiB,CAiDpH;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,GAAG,iBAAiB,CAO7G;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,OAAO,EAAE,wBAAwB,GAAG,SAAS,sBAAsB,EAAE,CAezI;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,iBAAiB,GAAG;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAU3I"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
export function createAudioWaveform(input, options = {}) {
|
|
2
|
+
const buffer = audioBufferFromInput(input);
|
|
3
|
+
const channels = buffer.numberOfChannels;
|
|
4
|
+
const sampleRate = finitePositive(buffer.sampleRate, "sampleRate");
|
|
5
|
+
const duration = Math.max(0, buffer.duration);
|
|
6
|
+
const totalSamples = Math.max(0, Math.round(duration * sampleRate));
|
|
7
|
+
const samplesPerPeak = resolveSamplesPerPeak(totalSamples, options);
|
|
8
|
+
const peakCount = totalSamples === 0 ? 0 : Math.ceil(totalSamples / samplesPerPeak);
|
|
9
|
+
const peaks = [];
|
|
10
|
+
const sourceChannels = collectWaveformChannels(buffer, options.channel ?? "mix");
|
|
11
|
+
for (let peakIndex = 0; peakIndex < peakCount; peakIndex++) {
|
|
12
|
+
const start = peakIndex * samplesPerPeak;
|
|
13
|
+
const end = Math.min(totalSamples, start + samplesPerPeak);
|
|
14
|
+
let min = 0;
|
|
15
|
+
let max = 0;
|
|
16
|
+
let sumSquares = 0;
|
|
17
|
+
let sampleCount = 0;
|
|
18
|
+
for (let sampleIndex = start; sampleIndex < end; sampleIndex++) {
|
|
19
|
+
let value = 0;
|
|
20
|
+
for (const channel of sourceChannels) {
|
|
21
|
+
value += channel[sampleIndex] ?? 0;
|
|
22
|
+
}
|
|
23
|
+
value /= sourceChannels.length;
|
|
24
|
+
min = Math.min(min, value);
|
|
25
|
+
max = Math.max(max, value);
|
|
26
|
+
sumSquares += value * value;
|
|
27
|
+
sampleCount++;
|
|
28
|
+
}
|
|
29
|
+
peaks.push({
|
|
30
|
+
min,
|
|
31
|
+
max,
|
|
32
|
+
rms: sampleCount === 0 ? 0 : Math.sqrt(sumSquares / sampleCount)
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
const normalize = options.normalize ?? false;
|
|
36
|
+
const outputPeaks = normalize ? normalizePeaks(peaks) : peaks;
|
|
37
|
+
return {
|
|
38
|
+
duration,
|
|
39
|
+
sampleRate,
|
|
40
|
+
channels,
|
|
41
|
+
peakCount: outputPeaks.length,
|
|
42
|
+
samplesPerPeak,
|
|
43
|
+
normalized: normalize,
|
|
44
|
+
peaks: outputPeaks
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export function sampleAudioWaveformAtTime(waveform, timeSeconds) {
|
|
48
|
+
if (waveform.peaks.length === 0 || waveform.duration <= 0) {
|
|
49
|
+
return { min: 0, max: 0, rms: 0 };
|
|
50
|
+
}
|
|
51
|
+
const normalizedTime = clamp(timeSeconds / waveform.duration, 0, 1);
|
|
52
|
+
const index = Math.min(waveform.peaks.length - 1, Math.floor(normalizedTime * waveform.peaks.length));
|
|
53
|
+
return waveform.peaks[index] ?? { min: 0, max: 0, rms: 0 };
|
|
54
|
+
}
|
|
55
|
+
export function createAudioWaveformPath(waveform, options) {
|
|
56
|
+
const width = finitePositive(options.width, "width");
|
|
57
|
+
const height = finitePositive(options.height, "height");
|
|
58
|
+
const padding = Math.max(0, options.padding ?? 0);
|
|
59
|
+
const drawableHeight = Math.max(1, height - padding * 2);
|
|
60
|
+
const centerY = padding + drawableHeight / 2;
|
|
61
|
+
const halfHeight = drawableHeight / 2;
|
|
62
|
+
const denominator = Math.max(1, waveform.peaks.length - 1);
|
|
63
|
+
return waveform.peaks.map((peak, index) => ({
|
|
64
|
+
x: waveform.peaks.length === 1 ? width / 2 : index / denominator * width,
|
|
65
|
+
yMin: centerY - clamp(peak.max, -1, 1) * halfHeight,
|
|
66
|
+
yMax: centerY - clamp(peak.min, -1, 1) * halfHeight,
|
|
67
|
+
rmsHeight: clamp(peak.rms, 0, 1) * halfHeight
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
70
|
+
export function audioWaveformPeakRange(waveform) {
|
|
71
|
+
let min = 0;
|
|
72
|
+
let max = 0;
|
|
73
|
+
let rmsMax = 0;
|
|
74
|
+
for (const peak of waveform.peaks) {
|
|
75
|
+
min = Math.min(min, peak.min);
|
|
76
|
+
max = Math.max(max, peak.max);
|
|
77
|
+
rmsMax = Math.max(rmsMax, peak.rms);
|
|
78
|
+
}
|
|
79
|
+
return { min, max, rmsMax };
|
|
80
|
+
}
|
|
81
|
+
function audioBufferFromInput(input) {
|
|
82
|
+
return "buffer" in input ? input.buffer : input;
|
|
83
|
+
}
|
|
84
|
+
function resolveSamplesPerPeak(totalSamples, options) {
|
|
85
|
+
if (options.samplesPerPeak !== undefined) {
|
|
86
|
+
return Math.max(1, Math.floor(finitePositive(options.samplesPerPeak, "samplesPerPeak")));
|
|
87
|
+
}
|
|
88
|
+
if (options.peakCount !== undefined) {
|
|
89
|
+
const peakCount = Math.max(1, Math.floor(finitePositive(options.peakCount, "peakCount")));
|
|
90
|
+
return Math.max(1, Math.ceil(totalSamples / peakCount));
|
|
91
|
+
}
|
|
92
|
+
return Math.max(1, Math.ceil(totalSamples / 1024));
|
|
93
|
+
}
|
|
94
|
+
function collectWaveformChannels(buffer, channel) {
|
|
95
|
+
if (buffer.numberOfChannels <= 0) {
|
|
96
|
+
throw new Error("Audio waveform requires at least one channel");
|
|
97
|
+
}
|
|
98
|
+
if (channel === "mix") {
|
|
99
|
+
return Array.from({ length: buffer.numberOfChannels }, (_, index) => buffer.getChannelData(index));
|
|
100
|
+
}
|
|
101
|
+
if (!Number.isInteger(channel) || channel < 0 || channel >= buffer.numberOfChannels) {
|
|
102
|
+
throw new Error(`Audio waveform channel ${channel} is outside the buffer channel range`);
|
|
103
|
+
}
|
|
104
|
+
return [buffer.getChannelData(channel)];
|
|
105
|
+
}
|
|
106
|
+
function normalizePeaks(peaks) {
|
|
107
|
+
let maxAbs = 0;
|
|
108
|
+
for (const peak of peaks) {
|
|
109
|
+
maxAbs = Math.max(maxAbs, Math.abs(peak.min), Math.abs(peak.max), peak.rms);
|
|
110
|
+
}
|
|
111
|
+
if (maxAbs <= 0)
|
|
112
|
+
return peaks;
|
|
113
|
+
return peaks.map((peak) => ({
|
|
114
|
+
min: peak.min / maxAbs,
|
|
115
|
+
max: peak.max / maxAbs,
|
|
116
|
+
rms: peak.rms / maxAbs
|
|
117
|
+
}));
|
|
118
|
+
}
|
|
119
|
+
function finitePositive(value, label) {
|
|
120
|
+
if (!Number.isFinite(value) || value <= 0) {
|
|
121
|
+
throw new Error(`Audio waveform ${label} must be a positive finite number`);
|
|
122
|
+
}
|
|
123
|
+
return value;
|
|
124
|
+
}
|
|
125
|
+
function clamp(value, min, max) {
|
|
126
|
+
return Math.min(max, Math.max(min, value));
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=AudioWaveform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AudioWaveform.js","sourceRoot":"","sources":["../../../../packages/audio/src/AudioWaveform.ts"],"names":[],"mappings":"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"}
|
package/dist/audio/index.d.ts
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
export { AudioBus } from "./AudioBus";
|
|
2
2
|
export { AudioClip } from "./AudioClip";
|
|
3
3
|
export type { AudioClipOptions } from "./AudioClip";
|
|
4
|
+
export { AudioFileManager } from "./AudioFileManager";
|
|
5
|
+
export type { AudioDecodeContextLike, AudioFileAssetLike, AudioFileFetchResponseLike, AudioFileInput, AudioFileManagerOptions, AudioFileRequest, ResolvedAudioFileRequest } from "./AudioFileManager";
|
|
6
|
+
export { createAudioTimelineMixSnapshot, defaultAudioTimelineBusForRole, AudioTimelineTrack } from "./AudioTimelineTrack";
|
|
7
|
+
export type { AudioTimelineBusMix, AudioTimelineClip, AudioTimelineClipOptions, AudioTimelineEnvelopePoint, AudioTimelineMixOptions, AudioTimelineMixSnapshot, AudioTimelineSample, AudioTimelineTrackOptions, AudioTimelineTrackRole } from "./AudioTimelineTrack";
|
|
8
|
+
export { audioWaveformPeakRange, createAudioWaveform, createAudioWaveformPath, sampleAudioWaveformAtTime } from "./AudioWaveform";
|
|
9
|
+
export type { AudioWaveformData, AudioWaveformInput, AudioWaveformOptions, AudioWaveformPathOptions, AudioWaveformPathPoint, AudioWaveformPeak } from "./AudioWaveform";
|
|
4
10
|
export { sampleAudioEffectsAnalysisFixture } from "./AudioEffectsAnalysisFixtures";
|
|
5
11
|
export type { AudioChorusPreset, AudioCompressorPreset, AudioDelayPreset, AudioDistortionCurve, AudioEffectsAnalysisFixture, AudioEffectsAnalysisFixtureOptions, AudioEqBandFixture, AudioSpectrumBandFixture } from "./AudioEffectsAnalysisFixtures";
|
|
6
12
|
export { sampleAdaptiveMusicFixture } from "./AdaptiveMusicFixtures";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/audio/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,iCAAiC,EAAE,MAAM,gCAAgC,CAAC;AACnF,YAAY,EACV,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,EACpB,2BAA2B,EAC3B,kCAAkC,EAClC,kBAAkB,EAClB,wBAAwB,EACzB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,YAAY,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChL,OAAO,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AACvE,YAAY,EAAE,uBAAuB,EAAE,8BAA8B,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC3H,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC7G,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/audio/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EACV,sBAAsB,EACtB,kBAAkB,EAClB,0BAA0B,EAC1B,cAAc,EACd,uBAAuB,EACvB,gBAAgB,EAChB,wBAAwB,EACzB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,8BAA8B,EAAE,8BAA8B,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1H,YAAY,EACV,mBAAmB,EACnB,iBAAiB,EACjB,wBAAwB,EACxB,0BAA0B,EAC1B,uBAAuB,EACvB,wBAAwB,EACxB,mBAAmB,EACnB,yBAAyB,EACzB,sBAAsB,EACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAClI,YAAY,EACV,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,wBAAwB,EACxB,sBAAsB,EACtB,iBAAiB,EAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,iCAAiC,EAAE,MAAM,gCAAgC,CAAC;AACnF,YAAY,EACV,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,EACpB,2BAA2B,EAC3B,kCAAkC,EAClC,kBAAkB,EAClB,wBAAwB,EACzB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,YAAY,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChL,OAAO,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AACvE,YAAY,EAAE,uBAAuB,EAAE,8BAA8B,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC3H,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC7G,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/audio/index.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
export { AudioBus } from "./AudioBus.js";
|
|
2
2
|
export { AudioClip } from "./AudioClip.js";
|
|
3
|
+
export { AudioFileManager } from "./AudioFileManager.js";
|
|
4
|
+
export { createAudioTimelineMixSnapshot, defaultAudioTimelineBusForRole, AudioTimelineTrack } from "./AudioTimelineTrack.js";
|
|
5
|
+
export { audioWaveformPeakRange, createAudioWaveform, createAudioWaveformPath, sampleAudioWaveformAtTime } from "./AudioWaveform.js";
|
|
3
6
|
export { sampleAudioEffectsAnalysisFixture } from "./AudioEffectsAnalysisFixtures.js";
|
|
4
7
|
export { sampleAdaptiveMusicFixture } from "./AdaptiveMusicFixtures.js";
|
|
5
8
|
export { sampleAudioEnvironmentFixture } from "./SpatialAudioFixtures.js";
|
package/dist/audio/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/audio/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,iCAAiC,EAAE,MAAM,gCAAgC,CAAC;AAWnF,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAErE,OAAO,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AAEvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/audio/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAUtD,OAAO,EAAE,8BAA8B,EAAE,8BAA8B,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAY1H,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AASlI,OAAO,EAAE,iCAAiC,EAAE,MAAM,gCAAgC,CAAC;AAWnF,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAErE,OAAO,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AAEvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { CartoonAssetProfile } from "@aura3d/asset-index";
|
|
2
|
+
export type AuraCliCartoonAssetProfile = CartoonAssetProfile;
|
|
3
|
+
export interface AuraCliCartoonAssetProfileDefinition {
|
|
4
|
+
readonly id: AuraCliCartoonAssetProfile;
|
|
5
|
+
readonly label: string;
|
|
6
|
+
readonly category: "character" | "prop" | "set" | "environment";
|
|
7
|
+
readonly requiredMetadata: readonly string[];
|
|
8
|
+
readonly optionalMetadata: readonly string[];
|
|
9
|
+
readonly rejectionReasons: readonly string[];
|
|
10
|
+
readonly resolveHints: readonly string[];
|
|
11
|
+
}
|
|
12
|
+
export declare const cartoonCliAssetProfiles: readonly AuraCliCartoonAssetProfileDefinition[];
|
|
13
|
+
export declare function getCartoonAssetProfileDefinition(profile: AuraCliCartoonAssetProfile): AuraCliCartoonAssetProfileDefinition | undefined;
|
|
14
|
+
//# sourceMappingURL=cartoon-asset-profiles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cartoon-asset-profiles.d.ts","sourceRoot":"","sources":["../../../../packages/aura3d-cli/src/cartoon-asset-profiles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,MAAM,MAAM,0BAA0B,GAAG,mBAAmB,CAAC;AAE7D,MAAM,WAAW,oCAAoC;IACnD,QAAQ,CAAC,EAAE,EAAE,0BAA0B,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,WAAW,GAAG,MAAM,GAAG,KAAK,GAAG,aAAa,CAAC;IAChE,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C;AAED,eAAO,MAAM,uBAAuB,EAAE,SAAS,oCAAoC,EAqClF,CAAC;AAEF,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,0BAA0B,GAClC,oCAAoC,GAAG,SAAS,CAElD"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export const cartoonCliAssetProfiles = [
|
|
2
|
+
{
|
|
3
|
+
id: "cartoon-character",
|
|
4
|
+
label: "Cartoon character",
|
|
5
|
+
category: "character",
|
|
6
|
+
requiredMetadata: ["verified redistributable license", "GLB model", "cartoon/stylized metadata", "rigged humanoid or skinned character evidence", "embedded animation clips", "checksum"],
|
|
7
|
+
optionalMetadata: ["facial morphs", "mouth bones", "emotion clips", "texture summary", "bounds"],
|
|
8
|
+
rejectionReasons: ["static asset", "non-character metadata", "missing rig evidence", "unverified license", "IP-risk metadata", "photoreal scan metadata", "oversized browser payload"],
|
|
9
|
+
resolveHints: ["Use --profile cartoon-character for animated humanoid or expressive mascot searches.", "Run assets validate-cartoon after resolve to confirm lip-sync and scale readiness."],
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
id: "cartoon-prop",
|
|
13
|
+
label: "Cartoon prop",
|
|
14
|
+
category: "prop",
|
|
15
|
+
requiredMetadata: ["verified redistributable license", "GLB model", "cartoon/stylized metadata", "prop-like category metadata", "checksum"],
|
|
16
|
+
optionalMetadata: ["bounds", "texture summary", "collision bounds", "triangle budget"],
|
|
17
|
+
rejectionReasons: ["unverified license", "IP-risk metadata", "photoreal scan metadata", "oversized browser payload", "non-prop metadata"],
|
|
18
|
+
resolveHints: ["Use --profile cartoon-prop for furniture, vehicles, nature props, tools, toys, and set dressing."],
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
id: "cartoon-set",
|
|
22
|
+
label: "Cartoon set",
|
|
23
|
+
category: "set",
|
|
24
|
+
requiredMetadata: ["verified redistributable license", "GLB model", "cartoon/stylized metadata", "set/location metadata", "checksum"],
|
|
25
|
+
optionalMetadata: ["environment-scale bounds", "walkable floor hints", "collision bounds", "thumbnail"],
|
|
26
|
+
rejectionReasons: ["unverified license", "IP-risk metadata", "photoreal scan metadata", "too small for a set", "oversized browser payload"],
|
|
27
|
+
resolveHints: ["Use --profile cartoon-set for rooms, parks, schools, streets, stages, and episode locations."],
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
id: "cartoon-environment",
|
|
31
|
+
label: "Cartoon environment",
|
|
32
|
+
category: "environment",
|
|
33
|
+
requiredMetadata: ["verified redistributable license", "GLB backdrop/world model", "cartoon/stylized metadata", "environment/backdrop metadata", "checksum"],
|
|
34
|
+
optionalMetadata: ["large-scale bounds", "skybox/backdrop hints", "thumbnail", "lighting notes"],
|
|
35
|
+
rejectionReasons: ["unverified license", "IP-risk metadata", "photoreal scan metadata", "non-environment metadata", "oversized browser payload"],
|
|
36
|
+
resolveHints: ["Use --profile cartoon-environment for skyboxes, backdrops, worlds, terrains, horizons, and large scenic layers."],
|
|
37
|
+
},
|
|
38
|
+
];
|
|
39
|
+
export function getCartoonAssetProfileDefinition(profile) {
|
|
40
|
+
return cartoonCliAssetProfiles.find((candidate) => candidate.id === profile);
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=cartoon-asset-profiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cartoon-asset-profiles.js","sourceRoot":"","sources":["../../../../packages/aura3d-cli/src/cartoon-asset-profiles.ts"],"names":[],"mappings":"AAcA,MAAM,CAAC,MAAM,uBAAuB,GAAoD;IACtF;QACE,EAAE,EAAE,mBAAmB;QACvB,KAAK,EAAE,mBAAmB;QAC1B,QAAQ,EAAE,WAAW;QACrB,gBAAgB,EAAE,CAAC,kCAAkC,EAAE,WAAW,EAAE,2BAA2B,EAAE,+CAA+C,EAAE,0BAA0B,EAAE,UAAU,CAAC;QACzL,gBAAgB,EAAE,CAAC,eAAe,EAAE,aAAa,EAAE,eAAe,EAAE,iBAAiB,EAAE,QAAQ,CAAC;QAChG,gBAAgB,EAAE,CAAC,cAAc,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,2BAA2B,CAAC;QACtL,YAAY,EAAE,CAAC,sFAAsF,EAAE,oFAAoF,CAAC;KAC7L;IACD;QACE,EAAE,EAAE,cAAc;QAClB,KAAK,EAAE,cAAc;QACrB,QAAQ,EAAE,MAAM;QAChB,gBAAgB,EAAE,CAAC,kCAAkC,EAAE,WAAW,EAAE,2BAA2B,EAAE,6BAA6B,EAAE,UAAU,CAAC;QAC3I,gBAAgB,EAAE,CAAC,QAAQ,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,iBAAiB,CAAC;QACtF,gBAAgB,EAAE,CAAC,oBAAoB,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,2BAA2B,EAAE,mBAAmB,CAAC;QACzI,YAAY,EAAE,CAAC,kGAAkG,CAAC;KACnH;IACD;QACE,EAAE,EAAE,aAAa;QACjB,KAAK,EAAE,aAAa;QACpB,QAAQ,EAAE,KAAK;QACf,gBAAgB,EAAE,CAAC,kCAAkC,EAAE,WAAW,EAAE,2BAA2B,EAAE,uBAAuB,EAAE,UAAU,CAAC;QACrI,gBAAgB,EAAE,CAAC,0BAA0B,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,WAAW,CAAC;QACvG,gBAAgB,EAAE,CAAC,oBAAoB,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,2BAA2B,CAAC;QAC3I,YAAY,EAAE,CAAC,8FAA8F,CAAC;KAC/G;IACD;QACE,EAAE,EAAE,qBAAqB;QACzB,KAAK,EAAE,qBAAqB;QAC5B,QAAQ,EAAE,aAAa;QACvB,gBAAgB,EAAE,CAAC,kCAAkC,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,+BAA+B,EAAE,UAAU,CAAC;QAC5J,gBAAgB,EAAE,CAAC,oBAAoB,EAAE,uBAAuB,EAAE,WAAW,EAAE,gBAAgB,CAAC;QAChG,gBAAgB,EAAE,CAAC,oBAAoB,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,2BAA2B,CAAC;QAChJ,YAAY,EAAE,CAAC,iHAAiH,CAAC;KAClI;CACF,CAAC;AAEF,MAAM,UAAU,gCAAgC,CAC9C,OAAmC;IAEnC,OAAO,uBAAuB,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;AAC/E,CAAC"}
|