refactor: switch cutscene camera to viewport/UV-based system

This commit is contained in:
vottozi committed 2026-04-16 01:29:01 +06:00
1 parent ceebb13719
commit 2494a44e4a
10 files changed
+407 -100

No files matched your search

+23 -21
View File
@@ -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;