1
0
mirror of https://github.com/XProger/OpenLara.git synced 2025-07-31 18:30:19 +02:00

pause in spectator mode

This commit is contained in:
XProger
2021-03-24 04:03:08 +03:00
parent 2f788bd67e
commit 80bf5322a1
2 changed files with 57 additions and 38 deletions

View File

@@ -69,6 +69,7 @@ struct Camera : ICamera {
spectator = false; spectator = false;
specTimer = 0.0f; specTimer = 0.0f;
targetAngle = vec3(0.0f);
} }
void reset() { void reset() {
@@ -388,31 +389,33 @@ struct Camera : ICamera {
} }
} }
if (!firstPerson) { if (!spectator) {
TR::CameraFrame *frameA = &level->cameraFrames[indexA]; if (!firstPerson) {
TR::CameraFrame *frameB = &level->cameraFrames[indexB]; TR::CameraFrame *frameA = &level->cameraFrames[indexA];
TR::CameraFrame *frameB = &level->cameraFrames[indexB];
const float maxDelta = 512 * 512; const float maxDelta = 512 * 512;
float dp = (vec3(frameA->pos) - vec3(frameB->pos)).length2(); float dp = (vec3(frameA->pos) - vec3(frameB->pos)).length2();
float dt = (vec3(frameA->target) - vec3(frameB->target)).length2(); float dt = (vec3(frameA->target) - vec3(frameB->target)).length2();
if (dp > maxDelta || dt > maxDelta) { if (dp > maxDelta || dt > maxDelta) {
eye.pos = frameA->pos; eye.pos = frameA->pos;
target.pos = frameA->target; target.pos = frameA->target;
fov = frameA->fov / 32767.0f * 120.0f; fov = frameA->fov / 32767.0f * 120.0f;
} else { } else {
eye.pos = vec3(frameA->pos).lerp(frameB->pos, t); eye.pos = vec3(frameA->pos).lerp(frameB->pos, t);
target.pos = vec3(frameA->target).lerp(frameB->target, t); target.pos = vec3(frameA->target).lerp(frameB->target, t);
fov = lerp(frameA->fov / 32767.0f * 120.0f, frameB->fov / 32767.0f * 120.0f, t); fov = lerp(frameA->fov / 32767.0f * 120.0f, frameB->fov / 32767.0f * 120.0f, t);
} }
eye.pos = level->cutMatrix * eye.pos; eye.pos = level->cutMatrix * eye.pos;
target.pos = level->cutMatrix * target.pos; target.pos = level->cutMatrix * target.pos;
mViewInv = mat4(eye.pos, target.pos, vec3(0, -1, 0)); mViewInv = mat4(eye.pos, target.pos, vec3(0, -1, 0));
} else } else
updateFirstPerson(); updateFirstPerson();
}
} else { } else {
if (Core::settings.detail.stereo == Core::Settings::STEREO_VR) { if (Core::settings.detail.stereo == Core::Settings::STEREO_VR) {
lookAngle = vec3(0.0f); lookAngle = vec3(0.0f);
@@ -558,6 +561,7 @@ struct Camera : ICamera {
if (specJoy.down[jkL] && specJoy.down[jkR]) { if (specJoy.down[jkL] && specJoy.down[jkR]) {
specTimer += Core::deltaTime; specTimer += Core::deltaTime;
if (specTimer > SPECTATOR_TIMER) { if (specTimer > SPECTATOR_TIMER) {
firstPerson = false;
spectator = !spectator; spectator = !spectator;
specTimer = 0.0f; specTimer = 0.0f;
specPos = eye.pos; specPos = eye.pos;

View File

@@ -66,6 +66,7 @@ struct Level : IGame {
bool needRenderInventory; bool needRenderInventory;
bool showStats; bool showStats;
bool skyIsVisible; bool skyIsVisible;
bool paused;
TR::LevelID nextLevel; TR::LevelID nextLevel;
@@ -936,6 +937,8 @@ struct Level : IGame {
//============================== //==============================
Level(Stream &stream) : level(stream), waitTrack(false), isEnded(false), cutsceneWaitTimer(0.0f), animTexTimer(0.0f), statsTimeDelta(0.0f) { Level(Stream &stream) : level(stream), waitTrack(false), isEnded(false), cutsceneWaitTimer(0.0f), animTexTimer(0.0f), statsTimeDelta(0.0f) {
paused = false;
level.simpleItems = Core::settings.detail.simple == 1; level.simpleItems = Core::settings.detail.simple == 1;
level.initModelIndices(); level.initModelIndices();
@@ -2241,25 +2244,35 @@ struct Level : IGame {
} }
} }
params->time += Core::deltaTime; if (camera->spectator && Input::lastState[0] == cStart) {
animTexTimer += Core::deltaTime; paused = !paused;
float timeStep = ANIM_TEX_TIMESTEP;
if (level.version & TR::VER_TR1)
timeStep *= 0.5f;
if (animTexTimer > timeStep) {
level.shiftAnimTex();
animTexTimer -= timeStep;
} }
updateEffect(); if (!paused) {
params->time += Core::deltaTime;
animTexTimer += Core::deltaTime;
Controller *c = Controller::first; float timeStep = ANIM_TEX_TIMESTEP;
while (c) { if (level.version & TR::VER_TR1)
Controller *next = c->next; timeStep *= 0.5f;
c->update();
c = next; if (animTexTimer > timeStep) {
level.shiftAnimTex();
animTexTimer -= timeStep;
}
updateEffect();
Controller *c = Controller::first;
while (c) {
Controller *next = c->next;
c->update();
c = next;
}
} else {
if (camera->spectator) {
camera->update();
}
} }
if (waterCache) if (waterCache)
@@ -3405,7 +3418,7 @@ struct Level : IGame {
Core::resetLights(); Core::resetLights();
if (!level.isCutsceneLevel()) { if (!level.isCutsceneLevel() && !camera->spectator) {
// render health & oxygen bars // render health & oxygen bars
vec2 size = vec2(180, 10); vec2 size = vec2(180, 10);
@@ -3442,7 +3455,9 @@ struct Level : IGame {
UI::renderHelp(); UI::renderHelp();
} }
UI::renderSubs(); if (!camera->spectator) {
UI::renderSubs();
}
UI::end(); UI::end();