refactor: switch cutscene camera to viewport/UV-based system
This commit is contained in:
1 parent
ceebb13719
commit
2494a44e4a
10 files changed
+407
-100
No files matched your search
@@ -439,29 +439,39 @@ void DialogueRuntime::advanceCutsceneLine() {
|
||||
refreshCutscenePresentation();
|
||||
}
|
||||
|
||||
CutsceneCameraPose DialogueRuntime::evaluateCutsceneCameraPose() const {
|
||||
CutsceneCameraPose defaultPose{};
|
||||
CutsceneCameraBlendState DialogueRuntime::evaluateCutsceneCameraBlend() const {
|
||||
CutsceneCameraBlendState result;
|
||||
result.active = false;
|
||||
result.from = {};
|
||||
result.to = {};
|
||||
result.t = 1.0f;
|
||||
|
||||
if (!activeCutscene || activeCutscene->cameraTrack.empty()) {
|
||||
return defaultPose;
|
||||
return result;
|
||||
}
|
||||
|
||||
int elapsed = cutsceneElapsedMs;
|
||||
for (const CutsceneCameraSegment& segment : activeCutscene->cameraTrack) {
|
||||
const int durationMs = std::max(segment.durationMs, 1);
|
||||
if (elapsed <= durationMs) {
|
||||
const float rawT = static_cast<float>(elapsed) / static_cast<float>(durationMs);
|
||||
const float t = applyEasing(segment.easing, std::clamp(rawT, 0.0f, 1.0f));
|
||||
CutsceneCameraPose pose;
|
||||
pose.focusX = segment.from.focusX + (segment.to.focusX - segment.from.focusX) * t;
|
||||
pose.focusY = segment.from.focusY + (segment.to.focusY - segment.from.focusY) * t;
|
||||
pose.zoom = segment.from.zoom + (segment.to.zoom - segment.from.zoom) * t;
|
||||
pose.rotationDeg = segment.from.rotationDeg + (segment.to.rotationDeg - segment.from.rotationDeg) * t;
|
||||
return pose;
|
||||
result.active = true;
|
||||
result.from = segment.from;
|
||||
result.to = segment.to;
|
||||
result.t = applyEasing(
|
||||
segment.easing,
|
||||
std::clamp(static_cast<float>(elapsed) / static_cast<float>(durationMs), 0.0f, 1.0f)
|
||||
);
|
||||
return result;
|
||||
}
|
||||
elapsed -= durationMs;
|
||||
}
|
||||
|
||||
return activeCutscene->cameraTrack.back().to;
|
||||
result.active = true;
|
||||
result.from = activeCutscene->cameraTrack.back().to;
|
||||
result.to = activeCutscene->cameraTrack.back().to;
|
||||
result.t = 1.0f;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void DialogueRuntime::refreshCutscenePresentation() {
|
||||
@@ -471,15 +481,7 @@ void DialogueRuntime::refreshCutscenePresentation() {
|
||||
|
||||
presentation.mode = PresentationMode::Cutscene;
|
||||
presentation.backgroundPath = activeCutscene->background;
|
||||
presentation.cutsceneCamera = evaluateCutsceneCameraPose();
|
||||
|
||||
std::cout << "[CUTSCENE] pose focus=("
|
||||
<< presentation.cutsceneCamera.focusX << ", "
|
||||
<< presentation.cutsceneCamera.focusY << ") zoom="
|
||||
<< presentation.cutsceneCamera.zoom
|
||||
<< " rot=" << presentation.cutsceneCamera.rotationDeg
|
||||
<< " line=" << currentCutsceneLine
|
||||
<< std::endl;
|
||||
presentation.cutsceneCamera = evaluateCutsceneCameraBlend();
|
||||
|
||||
presentation.choices.clear();
|
||||
presentation.selectedChoice = 0;
|
||||
|
||||
Reference in new issue
Block a user