From db81b62274f8316b10039544e620de2985cdce03 Mon Sep 17 00:00:00 2001 From: Terry Jia Date: Wed, 7 May 2025 10:12:33 -0400 Subject: [PATCH] [3d] add record video support for load3d animation node (#3798) --- src/components/load3d/Load3DAnimation.vue | 70 +++++++++++++++++++ .../load3d/Load3DAnimationScene.vue | 14 ++++ src/extensions/core/load3d.ts | 21 +++++- src/extensions/core/load3d/Load3d.ts | 3 +- .../core/load3d/RecordingManager.ts | 6 +- 5 files changed, 109 insertions(+), 5 deletions(-) diff --git a/src/components/load3d/Load3DAnimation.vue b/src/components/load3d/Load3DAnimation.vue index 5b78cf05b..175664ac5 100644 --- a/src/components/load3d/Load3DAnimation.vue +++ b/src/components/load3d/Load3DAnimation.vue @@ -32,6 +32,7 @@ @background-image-change="listenBackgroundImageChange" @animation-list-change="animationListChange" @up-direction-change="listenUpDirectionChange" + @recording-status-change="listenRecordingStatusChange" />
+
+ +
@@ -75,6 +91,7 @@ import { computed, ref } from 'vue' import Load3DAnimationControls from '@/components/load3d/Load3DAnimationControls.vue' import Load3DAnimationScene from '@/components/load3d/Load3DAnimationScene.vue' import Load3DControls from '@/components/load3d/Load3DControls.vue' +import RecordingControls from '@/components/load3d/controls/RecordingControls.vue' import Load3dUtils from '@/extensions/core/load3d/Load3dUtils' import { AnimationItem, @@ -111,6 +128,11 @@ const selectedSpeed = ref(1) const selectedAnimation = ref(0) const backgroundImage = ref('') +const isRecording = ref(false) +const hasRecording = ref(false) +const recordingDuration = ref(0) +const showRecordingControls = ref(!inputSpec.isPreview) + const showPreviewButton = computed(() => { return !type.includes('Preview') }) @@ -133,6 +155,54 @@ const handleMouseLeave = () => { } } +const handleStartRecording = async () => { + const sceneRef = load3DAnimationSceneRef.value?.load3DSceneRef + if (sceneRef?.load3d) { + await sceneRef.load3d.startRecording() + isRecording.value = true + } +} + +const handleStopRecording = () => { + const sceneRef = load3DAnimationSceneRef.value?.load3DSceneRef + if (sceneRef?.load3d) { + sceneRef.load3d.stopRecording() + isRecording.value = false + hasRecording.value = true + recordingDuration.value = sceneRef.load3d.getRecordingDuration() + } +} + +const handleExportRecording = () => { + const sceneRef = load3DAnimationSceneRef.value?.load3DSceneRef + if (sceneRef?.load3d) { + const timestamp = new Date().toISOString().replace(/[:.]/g, '-') + const filename = `${timestamp}-animation-recording.mp4` + sceneRef.load3d.exportRecording(filename) + } +} + +const handleClearRecording = () => { + const sceneRef = load3DAnimationSceneRef.value?.load3DSceneRef + if (sceneRef?.load3d) { + sceneRef.load3d.clearRecording() + hasRecording.value = false + recordingDuration.value = 0 + } +} + +const listenRecordingStatusChange = (value: boolean) => { + isRecording.value = value + + if (!value) { + const sceneRef = load3DAnimationSceneRef.value?.load3DSceneRef + if (sceneRef?.load3d) { + hasRecording.value = true + recordingDuration.value = sceneRef.load3d.getRecordingDuration() + } + } +} + const switchCamera = () => { cameraType.value = cameraType.value === 'perspective' ? 'orthographic' : 'perspective' diff --git a/src/components/load3d/Load3DAnimationScene.vue b/src/components/load3d/Load3DAnimationScene.vue index a9988fd8b..d069c3384 100644 --- a/src/components/load3d/Load3DAnimationScene.vue +++ b/src/components/load3d/Load3DAnimationScene.vue @@ -20,6 +20,7 @@ @camera-type-change="listenCameraTypeChange" @show-grid-change="listenShowGridChange" @show-preview-change="listenShowPreviewChange" + @recording-status-change="listenRecordingStatusChange" />