From 37044d0f3d1d0eea7c7da782004f714062bc3709 Mon Sep 17 00:00:00 2001 From: BlueRose <378100977@qq.com> Date: Wed, 27 Nov 2024 17:06:35 +0800 Subject: [PATCH] vault backup: 2024-11-27 17:06:35 --- 02-Note/ASoul/动画相关/Sequaio.md | 16 ------ 02-Note/ASoul/导播台笔记/Sequoia.md | 81 ++++++++++++++++++++++++++--- 2 files changed, 74 insertions(+), 23 deletions(-) delete mode 100644 02-Note/ASoul/动画相关/Sequaio.md diff --git a/02-Note/ASoul/动画相关/Sequaio.md b/02-Note/ASoul/动画相关/Sequaio.md deleted file mode 100644 index ccea979..0000000 --- a/02-Note/ASoul/动画相关/Sequaio.md +++ /dev/null @@ -1,16 +0,0 @@ - -# Motion写入逻辑 - -正确导入Motion的Log -```c++ -[2024.10.23-05.22.35:360][637]LogSequoia: SequoiaFileRefPool:: Load FileRef start ++++++:C:/LiveDirectorSaved/Sequoia/心宜思诺一周年/LIKE THAT.Sequoia/1D20B3CA4D4B5CED1D7312AE0D9EBF9F.motion -``` - -错误 -```c++ -LogSequoia: SequoiaData file ref load complete, sequoiaPath = :/Sequoia/心宜思诺一周年/初智齿.Sequoia/初智齿.json -``` - -## 录制逻辑 -LogSequoia: UMotionCaptureRecorder::StartRecord start record motion frames from avatar:Idol.F07 -LogSequoia: UMotionCaptureRecorder::StopRecordstop record motion frames from avatar:Idol.F07, frames:0 \ No newline at end of file diff --git a/02-Note/ASoul/导播台笔记/Sequoia.md b/02-Note/ASoul/导播台笔记/Sequoia.md index 70b0ce1..a53d828 100644 --- a/02-Note/ASoul/导播台笔记/Sequoia.md +++ b/02-Note/ASoul/导播台笔记/Sequoia.md @@ -120,16 +120,83 @@ OnEvaluate(EvalSections: $Ref>, EvalStartTime: 2. 取得ESequoiaEvaluateMode为EEM_Inside与EEM_JumpIn的所有EvalSections。 3. 判断Template是否发生改变,如果改变则调用`evalTemplate.SetTemplateSource()`。 4. 调用`evalTemplate::Evaluate()`。 - -## ISequoiaEvalTemplate(SequoiaCamShotEvalTemplate) -- InitTemplate: -- SetTemplateSource -- Evaluate - -## SequoiaCamSection +## SequoiaCamSection => SequoiaCamSection => TsSequoiaSection。 - 数据Model类使用SequoiaCamSectionModel。 - SequoiaCamShotEvalTemplate +## ISequoiaEvalTemplate(SequoiaCamShotEvalTemplate) +- InitTemplate: +- SetTemplateSource:用来设置对应的*ICamShotEvalHandle* +- Evaluate + +ISequoiaEvalTemplate => ICamShotEvalHandle.Eval() +在计算Section、以及FrameOffset参数之后,调用***DirectorCamSequoiaHandle.PlayCamShotSection()***,在创建newTask(***CamTaskDataRPC***)之后,最终会调用directorCamManager.RequestPGMTaskServerUnreliable()/RequestPVWTaskServer()进入导播系统循环。 + +```ts +let newTask = new UE.CamTaskDataRPC() +newTask.WorkShopId = DirectorCamUtil.CopyGuid(workShopId) +newTask.CamGroupId = DirectorCamUtil.CopyGuid(camSection.camGroupId) +newTask.CamIndex = camSection.camIndex +newTask.StartFrame = camSection.GetStartFrameOffset().Value + frameOffset +newTask.bPreviewOneFrame = bPreviewOneFrame +``` + +## DirectorCamManager +1. this.RequestPVWTask(newPVWTaskData) +2. this.HandlePreStreamTaskDataMulticast(newPVWTaskData) + 1. DirectorCamUtil.EnsureWorkShopReady():确保WorkShop有效并且已经初始化,之后就调用对应函数。 + 1. DirectorEventSystem.Emit(this, DirectorEvent.OnPVWTaskRequested): + 2. this.HandlePreStreamTaskByNetTag() + 1. PVW => this.HandlePVWTask() + 1. DirectorCamUtil.SubmitNewCommandIfDataNotChanged() + 3.  this.RecordLastPVWTime() + +### HandlePVWTask() +```ts + HandlePVWTask(): void { + if(!DirectorCamUtil.SubmitNewCommandIfDataNotChanged(this.preStreamTask, this.prestreamTaskData)){ + if (this.preStreamTask) { + this.preStreamTask.Stop() + } + this.preStreamTask = DirectorCamUtil.CreateCamTask(this, this.prestreamTaskData, CamTaskType.FullStream, this.droneCamera, + this.PVWWindow, this.handHeldCamera) + if (this.preStreamTask) { + this.preStreamTask.Start() + + if (this.PVWWindow) { + this.PVWWindow.SetViewBorderColor(0, new UE.LinearColor(0, 1, 0, 1)) + } + + console.log('PVW Task: ' + this.preStreamTask.workShop.BindPlacement.Title + " " + this.preStreamTask.groupName + " " + + this.preStreamTask.camName) + } + } + } +``` +通过DirectorCamUtil.SubmitNewCommandIfDataNotChanged()判断CamTaskDataRPC是否相同,如果Camera机位相同则直接提交。 +如果不同,比如换机位了,就调用 +`DirectorCamUtil.CreateCamTask() => this.preStreamTask.Start()` +来发送新的任务。 + +```ts + export function SubmitNewCommandIfDataNotChanged(task : DirectorCamTask, taskData : UE.CamTaskDataRPC):boolean{ + let bSubmitSuccess = false + + if(task && taskData){ + let bWorkShopEqual = IsGuidEqual(task.workShopId, taskData.WorkShopId) + let bCamGroupEqual = IsGuidEqual(task.groupId, taskData.CamGroupId) + let bCamIndexEqual = task.GetMainCamIndex() == taskData.CamIndex + let bNotSpecialCam = taskData.CamIndex != HANDHELD_CAM_INDEX && taskData.CamIndex != DRONE_CAM_INDEX + if(bWorkShopEqual && bCamGroupEqual && bCamIndexEqual && bNotSpecialCam){ + // submit new cmd + task.SubmitNewCommand(taskData) + bSubmitSuccess = true + } + } + + return bSubmitSuccess + } +``` ## 裁剪相关逻辑 DirectorCamSequoiaHandle.PlayCamShotSection()