[Scummvm-git-logs] scummvm master -> 3f9d18d593c0462ca731d48b67a6e45a080cca9b
somaen
noreply at scummvm.org
Sat Oct 26 23:17:27 UTC 2024
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
3f9d18d593 WATCHMAKER: Wrap Camera handling in a class to avoid global constructors
Commit: 3f9d18d593c0462ca731d48b67a6e45a080cca9b
https://github.com/scummvm/scummvm/commit/3f9d18d593c0462ca731d48b67a6e45a080cca9b
Author: Einar Johan Trøan SømaÌen (somaen at scummvm.org)
Date: 2024-10-27T01:15:39+02:00
Commit Message:
WATCHMAKER: Wrap Camera handling in a class to avoid global constructors
Changed paths:
engines/watchmaker/classes/do_camera.cpp
engines/watchmaker/classes/do_camera.h
engines/watchmaker/classes/do_dialog.cpp
engines/watchmaker/classes/do_inv.cpp
engines/watchmaker/classes/do_keyboard.cpp
engines/watchmaker/classes/do_mouse.cpp
engines/watchmaker/classes/do_system.cpp
engines/watchmaker/game.cpp
engines/watchmaker/game.h
engines/watchmaker/ll/ll_anim.cpp
engines/watchmaker/ll/ll_mouse.cpp
engines/watchmaker/ll/ll_mouse.h
engines/watchmaker/ll/ll_regen.cpp
engines/watchmaker/ll/ll_util.cpp
engines/watchmaker/main.cpp
engines/watchmaker/schedule.cpp
engines/watchmaker/walk/ball.cpp
diff --git a/engines/watchmaker/classes/do_camera.cpp b/engines/watchmaker/classes/do_camera.cpp
index 2e8d64e9ce8..18177a92add 100644
--- a/engines/watchmaker/classes/do_camera.cpp
+++ b/engines/watchmaker/classes/do_camera.cpp
@@ -41,7 +41,6 @@
#include "watchmaker/renderer.h"
// locals
-#define MAX_CAMERA_STEPS 500
#define FIRST_PERSON_STEPS 8
#define CAMERA_CARRELLO_DIST 800.0f
#define MAX_CAMERA_MOVE 50.0f
@@ -50,24 +49,10 @@
namespace Watchmaker {
-t3dCAMERA FirstPersonCamera, *DestCamera, *LastCamera, CameraCarrello;
-t3dCAMERA CameraStep[MAX_CAMERA_STEPS], AnimCamera;
-int16 CurCameraSubStep = 0, CurCameraStep = 0, NumCameraSteps = 0;
-t3dV3F OldCameraTarget, OldPlayerDir, FirstPersonTarget;
-t3dV3F SourceBlend, TargetBlend;
-
-t3dV3F HeadAngles;
-t3dF32 CamAngleX, CamAngleY;
-
-uint8 bForceDirectCamera = false, bCameraCarrello = false;
-
-uint8 t3dCurCameraIndex = 255;
-uint8 t3dLastCameraIndex = 255;
-
/* -----------------20/10/98 10.40-------------------
* PickCamera
* --------------------------------------------------*/
-t3dCAMERA *PickCamera(t3dBODY *b, unsigned char in) {
+t3dCAMERA *CameraMan::PickCamera(t3dBODY *b, unsigned char in) {
// TODO: This is just here until we know when we can expect a nullptr
if (!b) {
return nullptr;
@@ -92,7 +77,7 @@ t3dCAMERA *t3dBODY::PickCamera(uint8 in) {
/* -----------------06/07/98 16.55-------------------
* GetRealCharPos
* --------------------------------------------------*/
-void GetRealCharPos(Init &init, t3dV3F *Target, int32 oc, uint8 bn) {
+void CameraMan::GetRealCharPos(Init &init, t3dV3F *Target, int32 oc, uint8 bn) {
t3dCHARACTER *Ch = Character[oc];
t3dMESH *mesh = Ch->Mesh, *m;
t3dBONE *bone;
@@ -160,7 +145,7 @@ uint8 DistPointRect(t3dV3F *i, t3dF32 *dist, t3dV3F *a, t3dV3F *b, t3dV3F *c) {
/* -----------------20/08/98 17.16-------------------
* HandleCameraCarrello
* --------------------------------------------------*/
-void HandleCameraCarrello(t3dBODY *croom) {
+void CameraMan::HandleCameraCarrello(t3dBODY *croom) {
t3dCAMERAPATH *cp = nullptr;
t3dF32 dist, mindist;
t3dV3F pt, i, b;
@@ -221,10 +206,61 @@ void HandleCameraCarrello(t3dBODY *croom) {
}
}
+void CameraMan::MoveHeadAngles(t3dF32 diffx, t3dF32 diffy) {
+ t3dF32 s;
+
+ if (((diffx == 0) && (diffy == 0)) || (bLPressed) || (bRPressed) || (bDialogActive)) return;
+
+ if (diffx < -10) diffx = -10;
+ else if (diffx > 10) diffx = 10;
+ if (diffy < -10) diffy = -10;
+ else if (diffy > 10) diffy = 10;
+
+ s = (t3dF32)bFirstPerson + 1.0f;
+ if (diffx > 0) {
+ if ((HeadAngles.x + diffx) >= MAX_HEAD_ANGLE_X * s) {
+ diffx = MAX_HEAD_ANGLE_X * s - HeadAngles.x;
+ HeadAngles.x = MAX_HEAD_ANGLE_X * s;
+ } else
+ HeadAngles.x += diffx;
+ } else {
+ if ((HeadAngles.x + diffx) < -MAX_HEAD_ANGLE_X * s) {
+ diffx = -MAX_HEAD_ANGLE_X * s - HeadAngles.x;
+ HeadAngles.x = -MAX_HEAD_ANGLE_X * s;
+ } else
+ HeadAngles.x += diffx;
+ }
+
+ if (diffy > 0) {
+ if ((HeadAngles.y + diffy) >= MAX_HEAD_ANGLE_Y * s) {
+ diffy = MAX_HEAD_ANGLE_Y * s - HeadAngles.y;
+ HeadAngles.y = MAX_HEAD_ANGLE_Y * s;
+ } else
+ HeadAngles.y += diffy;
+ } else {
+ if ((HeadAngles.y + diffy) < -MAX_HEAD_ANGLE_Y * s) {
+ diffy = -MAX_HEAD_ANGLE_Y * s - HeadAngles.y;
+ HeadAngles.y = -MAX_HEAD_ANGLE_Y * s;
+ } else
+ HeadAngles.y += diffy;
+ }
+
+ CamAngleX = ((t3dF32)diffy / 180.0f * T3D_PI);
+ CamAngleY = ((t3dF32)diffx / 180.0f * T3D_PI);
+ if (bFirstPerson && !bLockCamera && ((CamAngleX != 0.0f) || (CamAngleY != 0.0f)))
+ t3dRotateMoveCamera(t3dCurCamera, CamAngleX, CamAngleY, 0.0f);
+}
+
+void CameraMan::resetAngle() {
+ CamAngleX = 0.0f;
+ CamAngleY = 0.0f;
+ t3dVectFill(&HeadAngles, 0.0f);
+}
+
/* -----------------30/09/98 11.13-------------------
* GetCameraTaget
* --------------------------------------------------*/
-void GetCameraTarget(Init &init, t3dV3F *Target) {
+void CameraMan::GetCameraTarget(Init &init, t3dV3F *Target) {
int32 i;
if (!Target) return;
@@ -247,7 +283,7 @@ void GetCameraTarget(Init &init, t3dV3F *Target) {
/* -----------------05/06/98 15.34-------------------
* NextCameraStep
* --------------------------------------------------*/
-void NextCameraStep(WGame &game) {
+void CameraMan::NextCameraStep(WGame &game) {
t3dBONE *bone;
t3dV3F Target;
int16 i;
@@ -326,7 +362,7 @@ void NextCameraStep(WGame &game) {
/* -----------------05/06/98 15.50-------------------
* doCamera
* --------------------------------------------------*/
-void doCamera(WGame &game) {
+void CameraMan::doCamera(WGame &game) {
t3dV3F Dest, Dir, ct;
t3dF32 dist;
int16 row, col, i;
@@ -523,15 +559,15 @@ void doCamera(WGame &game) {
/* -----------------09/11/98 10.27-------------------
* ResetCameraSource
* --------------------------------------------------*/
-void ResetCameraSource() {
- t3dLastCameraIndex = 255;
+void CameraMan::ResetCameraSource() {
+ resetLastCameraIndex();
t3dCurCameraIndex = 255;
}
/* -----------------09/11/98 10.27-------------------
* ResetCameraTarget
* --------------------------------------------------*/
-void ResetCameraTarget() {
+void CameraMan::ResetCameraTarget() {
t3dVectFill(&OldCameraTarget, 0.0f);
}
@@ -579,7 +615,7 @@ uint8 ClipCameraMove(t3dV3F *NewT, t3dV3F *OldT, t3dV3F *Source) {
/* -----------------05/06/98 10.36-------------------
* ProcessCamera
* --------------------------------------------------*/
-void ProcessCamera(WGame &game) {
+void CameraMan::ProcessCamera(WGame &game) {
t3dCAMERAPATH *cp = nullptr;
t3dBODY *croom;
int16 row, col, i;
@@ -605,7 +641,7 @@ void ProcessCamera(WGame &game) {
t3dVectFill(&OldCameraTarget, 0.0f);
bForceDirectCamera = TRUE;
t3dCurCameraIndex = 255;
- t3dLastCameraIndex = 255;
+ resetLastCameraIndex();
_vm->_messageSystem.addWaitingMsgs(MP_WAIT_PORTAL);
// DebugLogFile("PortalCrossed %s",PortalCrossed->Name);
// PortalCrossed = nullptr;
@@ -816,7 +852,7 @@ void ProcessCamera(WGame &game) {
/* -----------------16/12/00 15.20-------------------
* GetCameraIndexUnderPlayer
* --------------------------------------------------*/
-uint8 GetCameraIndexUnderPlayer(int32 pl) {
+uint8 CameraMan::GetCameraIndexUnderPlayer(int32 pl) {
t3dBODY *croom;
int16 row, col;
int32 a, b;
@@ -861,7 +897,7 @@ uint8 GetCameraIndexUnderPlayer(int32 pl) {
/* -----------------08/10/98 18.08-------------------
* StartAnimCamera
* --------------------------------------------------*/
-void StartAnimCamera(WGame &game) {
+void CameraMan::StartAnimCamera(WGame &game) {
DebugLogFile("StartAnimCamera");
t3dLastCameraIndex = t3dCurCameraIndex;
if (ForcedCamera) t3dCurCameraIndex = ForcedCamera - 1;
@@ -884,7 +920,7 @@ void StartAnimCamera(WGame &game) {
/* -----------------09/11/98 10.32-------------------
* ClipGolfCameraMove
* --------------------------------------------------*/
-uint8 ClipGolfCameraMove(t3dV3F *NewT, t3dV3F *OldT, t3dV3F *Source) {
+uint8 CameraMan::ClipGolfCameraMove(t3dV3F *NewT, t3dV3F *OldT, t3dV3F *Source) {
t3dV3F n, o;
t3dF32 a, d, l;
diff --git a/engines/watchmaker/classes/do_camera.h b/engines/watchmaker/classes/do_camera.h
index f1208993613..0161103384a 100644
--- a/engines/watchmaker/classes/do_camera.h
+++ b/engines/watchmaker/classes/do_camera.h
@@ -28,19 +28,45 @@
namespace Watchmaker {
-extern t3dV3F HeadAngles;
-extern t3dF32 CamAngleX, CamAngleY;
-
-void GetCameraTarget(Init &init, t3dV3F *Target);
-t3dCAMERA *PickCamera(t3dBODY *b, unsigned char in);
-void doCamera(WGame &game);
-void GetRealCharPos(Init &init, t3dV3F *Target, int32 oc, uint8 bn);
-void ResetCameraTarget();
-void ResetCameraSource();
-void ProcessCamera(WGame &game);
-uint8 GetCameraIndexUnderPlayer(int32 pl);
-void StartAnimCamera(WGame &game);
-uint8 ClipGolfCameraMove(t3dV3F *NewT, t3dV3F *OldT, t3dV3F *Source);
+class CameraMan {
+ // Constants:
+ static const int MAX_CAMERA_STEPS = 500;
+
+ t3dCAMERA FirstPersonCamera, *DestCamera, *LastCamera, CameraCarrello;
+ t3dCAMERA CameraStep[MAX_CAMERA_STEPS], AnimCamera;
+ int16 CurCameraSubStep = 0, CurCameraStep = 0, NumCameraSteps = 0;
+ t3dV3F OldCameraTarget, OldPlayerDir, FirstPersonTarget;
+ t3dV3F SourceBlend, TargetBlend;
+
+
+ uint8 bForceDirectCamera = false, bCameraCarrello = false;
+
+ uint8 t3dCurCameraIndex = 255;
+ uint8 t3dLastCameraIndex = 255;
+
+ void NextCameraStep(WGame &game);
+ void HandleCameraCarrello(t3dBODY *croom);
+public:
+ t3dV3F HeadAngles;
+ t3dF32 CamAngleX, CamAngleY;
+
+ void resetAngle();
+ void resetLastCameraIndex() { t3dLastCameraIndex = 255; }
+ uint8 getCurCameraIndex() { return t3dCurCameraIndex; }
+
+ void MoveHeadAngles(t3dF32 diffx, t3dF32 diffy);
+ void GetCameraTarget(Init &init, t3dV3F *Target);
+ t3dCAMERA *PickCamera(t3dBODY *b, unsigned char in);
+ void doCamera(WGame &game);
+ void GetRealCharPos(Init &init, t3dV3F *Target, int32 oc, uint8 bn);
+ void ResetCameraTarget();
+ void ResetCameraSource();
+ void ProcessCamera(WGame &game);
+ uint8 GetCameraIndexUnderPlayer(int32 pl);
+ void StartAnimCamera(WGame &game);
+ uint8 ClipGolfCameraMove(t3dV3F *NewT, t3dV3F *OldT, t3dV3F *Source);
+};
+
} // End of namespace Watchmaker
diff --git a/engines/watchmaker/classes/do_dialog.cpp b/engines/watchmaker/classes/do_dialog.cpp
index 0d7101b8895..6c21513a1bd 100644
--- a/engines/watchmaker/classes/do_dialog.cpp
+++ b/engines/watchmaker/classes/do_dialog.cpp
@@ -328,7 +328,7 @@ void doDialog(WGame &game) {
//DebugFile("DLG: EndDialog %d",CurDialog);
StopObjAnim(game, ocCURPLAYER);
CharStop(ocCURPLAYER); //evito che negli interrupt (in particolare) rimanga in memoria l'animazione di ascolta
- ResetCameraTarget();
+ game._cameraMan->ResetCameraTarget();
init.Dialog[CurDialog].flags |= DIALOG_DONE;
CurDialog = dNULL;
bDialogActive = false;
@@ -347,15 +347,13 @@ void doDialog(WGame &game) {
if (NextDlg != dNULL)
_vm->_messageSystem.doEvent(EventClass::MC_DIALOG, ME_DIALOGSTART, MP_DEFAULT, NextDlg, 0, 0, nullptr, nullptr, nullptr);
else {
- extern uint8 t3dLastCameraIndex;
-
if ((init.Dialog[TheMessage->wparam1].obj) && (Character[init.Dialog[TheMessage->wparam1].obj]))
StartDiary(game, game._gameVars.getCurRoomId(), &Character[init.Dialog[TheMessage->wparam1].obj]->Mesh->Trasl);
else
StartDiary(game, game._gameVars.getCurRoomId(), nullptr);
DebugLogFile("EndDialog: resetto t3dLastCameraIndex");
- t3dLastCameraIndex = 255; //forzo ProcessCamera() a cercare una nuova camera, in modo finito il dialogo non rimane qualche strana camera
+ game._cameraMan->resetLastCameraIndex(); //forzo ProcessCamera() a cercare una nuova camera, in modo finito il dialogo non rimane qualche strana camera
}
} else
bDialogMenuActive = true;
diff --git a/engines/watchmaker/classes/do_inv.cpp b/engines/watchmaker/classes/do_inv.cpp
index 3e800497f6b..2652f4eef85 100644
--- a/engines/watchmaker/classes/do_inv.cpp
+++ b/engines/watchmaker/classes/do_inv.cpp
@@ -44,9 +44,6 @@
namespace Watchmaker {
-extern t3dV3F HeadAngles;
-extern t3dF32 CamAngleX, CamAngleY;
-
/* -----------------03/04/98 10.39-------------------
* IconInInv
* --------------------------------------------------*/
@@ -322,10 +319,8 @@ void doInventory(WGame &game) {
ChangePlayer(game, (uint8)((CurPlayer ^ 1) + ocDARRELL));
}
InvStatus = INV_OFF;
- CamAngleX = 0.0f;
- CamAngleY = 0.0f;
- t3dVectFill(&HeadAngles, 0.0f);
- GetCameraTarget(init, &t3dCurCamera->Target);
+ game._cameraMan->resetAngle();
+ game._cameraMan->GetCameraTarget(init, &t3dCurCamera->Target);
} else {
rGrabVideo("temp.tmp", 1);
InvStatus = INV_ON | INV_MODE1;
diff --git a/engines/watchmaker/classes/do_keyboard.cpp b/engines/watchmaker/classes/do_keyboard.cpp
index 2c69bd0b25b..62efc82bb7c 100644
--- a/engines/watchmaker/classes/do_keyboard.cpp
+++ b/engines/watchmaker/classes/do_keyboard.cpp
@@ -132,7 +132,7 @@ bool DInputNonExclusiveMouse() {
/* -----------------25/08/98 10.42-------------------
* HandleFirstPerson
* --------------------------------------------------*/
-void HandleFirstPersonView() {
+void HandleFirstPersonView(WGame &game) {
t3dF32 dist;
t3dV3F d, n;
@@ -207,7 +207,7 @@ void HandleFirstPersonView() {
if (y > MainDy) diffy = (t3dF32)((t3dF32)(y - MainDy) / 3.0f);
else if (y < 0) diffy = (t3dF32)((t3dF32)y / 3.0f);
- MoveHeadAngles(diffx, diffy);
+ game._cameraMan->MoveHeadAngles(diffx, diffy);
}
}
@@ -571,7 +571,7 @@ void ProcessKeyboard(WGame &game) {
KeyClear(Common::KEYCODE_RCTRL);
if (bSomeOneSpeak) bSkipTalk = TRUE;
- GetRealCharPos(game.init, &ct, ocCURPLAYER, 0);
+ game._cameraMan->GetRealCharPos(game.init, &ct, ocCURPLAYER, 0);
ct.y = CurFloorY;
for (a = 0; a < MAX_OBJS_IN_ROOM; a++) {
b = game.getCurRoom().objects[a];
@@ -651,7 +651,7 @@ void ProcessKeyboard(WGame &game) {
if (!t3dCurCamera) return;
if ((bFirstPerson) && !(bMovingCamera))
- HandleFirstPersonView();
+ HandleFirstPersonView(game);
if (bFirstPerson) {
_vm->_messageSystem.doEvent(EventClass::MC_MOUSE, ME_MOUSEUPDATE, MP_DEFAULT, 0, 0, 0, NULL, NULL, NULL);
diff --git a/engines/watchmaker/classes/do_mouse.cpp b/engines/watchmaker/classes/do_mouse.cpp
index 46e7ef2b30b..6b899f2cf50 100644
--- a/engines/watchmaker/classes/do_mouse.cpp
+++ b/engines/watchmaker/classes/do_mouse.cpp
@@ -50,9 +50,6 @@ namespace Watchmaker {
t3dV3F LastClickPos;
uint8 LastFloorHit;
-extern t3dV3F HeadAngles;
-extern t3dF32 CamAngleX, CamAngleY;
-
void doMouseButton(WGame &game) {
uint8 cp;
Init &init = game.init;
@@ -104,10 +101,8 @@ void doMouseButton(WGame &game) {
}
InvStatus = INV_OFF;
- CamAngleX = 0.0f;
- CamAngleY = 0.0f;
- t3dVectFill(&HeadAngles, 0.0f);
- GetCameraTarget(init, &t3dCurCamera->Target);
+ game._cameraMan->resetAngle();
+ game._cameraMan->GetCameraTarget(init, &t3dCurCamera->Target);
if (bFirstPerson)
game._renderer->setCurCameraViewport(CAMERA_FOV_1ST, bSuperView);
diff --git a/engines/watchmaker/classes/do_system.cpp b/engines/watchmaker/classes/do_system.cpp
index 7a1dddd50e0..0fc211fc2c2 100644
--- a/engines/watchmaker/classes/do_system.cpp
+++ b/engines/watchmaker/classes/do_system.cpp
@@ -532,7 +532,7 @@ void ProcessTime(WGame &game) {
ProcessCharacters(game);
ProcessAnims(game);
if (!bGolfActive)
- ProcessCamera(game);
+ game._cameraMan->ProcessCamera(game);
else
ProcessGopherCamera(game);
}
diff --git a/engines/watchmaker/game.cpp b/engines/watchmaker/game.cpp
index 685205e7ad3..8ded27e1b8a 100644
--- a/engines/watchmaker/game.cpp
+++ b/engines/watchmaker/game.cpp
@@ -183,6 +183,7 @@ WGame::WGame() : workDirs(WATCHMAKER_CFG_NAME) {
_vm = this;
_meshModifiers = new MeshModifiers();
_roomManager = RoomManager::create(this);
+ _cameraMan = new CameraMan();
configLoaderFlags(); // TODO: This should probably happen before the constructor
// if LoaderFlags & T3D_DEBUGMODE
@@ -212,6 +213,7 @@ WGame::~WGame() {
delete _meshModifiers;
delete _roomManager;
delete _rnd;
+ delete _cameraMan;
_vm = nullptr;
}
@@ -470,7 +472,7 @@ bool WGame::LoadAndSetup(const Common::String &name, uint8 lite) {
t3dStartTime();
if (!t3dCurRoom->CameraTable.empty())
- if (!(t3dCurCamera = PickCamera(t3dCurRoom, 0)))
+ if (!(t3dCurCamera = _cameraMan->PickCamera(t3dCurRoom, 0)))
t3dCurCamera = &t3dCurRoom->CameraTable[0];
if (t3dCurCamera)
init._globals._invVars.t3dIconCamera = *t3dCurCamera;
@@ -479,7 +481,7 @@ bool WGame::LoadAndSetup(const Common::String &name, uint8 lite) {
Player->Pos.y = Player->Mesh->Trasl.y = CurFloorY;
- GetCameraTarget(init, &t3dCurCamera->Target);
+ _cameraMan->GetCameraTarget(init, &t3dCurCamera->Target);
_renderer->setCurCameraViewport(t3dCurCamera->Fov, bSuperView);
mPosx = windowInfo.width / 2;
diff --git a/engines/watchmaker/game.h b/engines/watchmaker/game.h
index 8462636458e..f7943a6d4ce 100644
--- a/engines/watchmaker/game.h
+++ b/engines/watchmaker/game.h
@@ -23,12 +23,12 @@
#define WATCHMAKER_GAME_H
#include "common/random.h"
-#include "watchmaker/fonts.h"
-#include "watchmaker/schedule.h"
#include "watchmaker/3d/loader.h"
+#include "watchmaker/fonts.h"
#include "watchmaker/game_options.h"
#include "watchmaker/ll/ll_ffile.h"
#include "watchmaker/saveload.h"
+#include "watchmaker/schedule.h"
#include "watchmaker/work_dirs.h"
namespace Watchmaker {
@@ -51,6 +51,7 @@ public:
class MeshModifiers;
class RoomManager;
+class CameraMan;
class WGame {
bool g_bReady = false, g_bActive = false;
@@ -71,6 +72,7 @@ public:
Fonts _fonts;
MessageSystem _messageSystem;
RoomManager *_roomManager;
+ CameraMan *_cameraMan;
WGame();
~WGame();
diff --git a/engines/watchmaker/ll/ll_anim.cpp b/engines/watchmaker/ll/ll_anim.cpp
index 1cc86f35dc4..86daee4f6b9 100644
--- a/engines/watchmaker/ll/ll_anim.cpp
+++ b/engines/watchmaker/ll/ll_anim.cpp
@@ -323,7 +323,7 @@ void ProcessATFDO(WGame &game, int32 in) {
else
StartAnim(game, aDARRELL_ASCOLTA);
- cindex = GetCameraIndexUnderPlayer(ocDARRELL + (CurPlayer ^ 1));
+ cindex = game._cameraMan->GetCameraIndexUnderPlayer(ocDARRELL + (CurPlayer ^ 1));
if (cindex != 255) {
// equivale ad un "setcamera:"
ForcedCamera = GetAlternateCamera(init, (uint8)(cindex + 1));
@@ -764,7 +764,7 @@ void ProcessATF(WGame &game, int32 an, int32 atf) {
CameraTargetObj = in;
break;
case ATF_UPDATE_MAX_TARGET:
- GetCameraTarget(init, &t3dCurCamera->MaxTarget);
+ game._cameraMan->GetCameraTarget(init, &t3dCurCamera->MaxTarget);
break;
case ATF_SUB_MUSIC:
CurSubMusic = in;
@@ -1514,7 +1514,8 @@ void StartAnim(WGame &game, int32 an) {
h->sub[a].ptr->CurFrame = 0;
// Se e' un'animazione di una camera
- if (h->sub[a].ptr == &game.init._globals._invVars.CameraDummy) StartAnimCamera(game);
+ if (h->sub[a].ptr == &game.init._globals._invVars.CameraDummy)
+ game._cameraMan->StartAnimCamera(game);
}
if (AnimAutoPush) {
PushATF(AnimAutoPush);
diff --git a/engines/watchmaker/ll/ll_mouse.cpp b/engines/watchmaker/ll/ll_mouse.cpp
index 3c7bba07c4f..200ca974e55 100644
--- a/engines/watchmaker/ll/ll_mouse.cpp
+++ b/engines/watchmaker/ll/ll_mouse.cpp
@@ -34,51 +34,6 @@ int32 mPosy = 0, mPosx = 0, mMoveX = 0, mMoveY = 0, mMove = 0, mCounter = 0, mHo
uint8 bLPressed = 0, bRPressed = 0, mHide = 1, bSkipped = 0;
uint8 bLPressedPrev = 0, bRPressedPrev = 0;
-void MoveHeadAngles(t3dF32 diffx, t3dF32 diffy) {
- t3dF32 s;
-
- if (((diffx == 0) && (diffy == 0)) || (bLPressed) || (bRPressed) || (bDialogActive)) return;
-
- if (diffx < -10) diffx = -10;
- else if (diffx > 10) diffx = 10;
- if (diffy < -10) diffy = -10;
- else if (diffy > 10) diffy = 10;
-
- s = (t3dF32)bFirstPerson + 1.0f;
- if (diffx > 0) {
- if ((HeadAngles.x + diffx) >= MAX_HEAD_ANGLE_X * s) {
- diffx = MAX_HEAD_ANGLE_X * s - HeadAngles.x;
- HeadAngles.x = MAX_HEAD_ANGLE_X * s;
- } else
- HeadAngles.x += diffx;
- } else {
- if ((HeadAngles.x + diffx) < -MAX_HEAD_ANGLE_X * s) {
- diffx = -MAX_HEAD_ANGLE_X * s - HeadAngles.x;
- HeadAngles.x = -MAX_HEAD_ANGLE_X * s;
- } else
- HeadAngles.x += diffx;
- }
-
- if (diffy > 0) {
- if ((HeadAngles.y + diffy) >= MAX_HEAD_ANGLE_Y * s) {
- diffy = MAX_HEAD_ANGLE_Y * s - HeadAngles.y;
- HeadAngles.y = MAX_HEAD_ANGLE_Y * s;
- } else
- HeadAngles.y += diffy;
- } else {
- if ((HeadAngles.y + diffy) < -MAX_HEAD_ANGLE_Y * s) {
- diffy = -MAX_HEAD_ANGLE_Y * s - HeadAngles.y;
- HeadAngles.y = -MAX_HEAD_ANGLE_Y * s;
- } else
- HeadAngles.y += diffy;
- }
-
- CamAngleX = ((t3dF32)diffy / 180.0f * T3D_PI);
- CamAngleY = ((t3dF32)diffx / 180.0f * T3D_PI);
- if (bFirstPerson && !bLockCamera && ((CamAngleX != 0.0f) || (CamAngleY != 0.0f)))
- t3dRotateMoveCamera(t3dCurCamera, CamAngleX, CamAngleY, 0.0f);
-}
-
/* -----------------08/05/98 11.47-------------------
* ProcessMouse
* --------------------------------------------------*/
@@ -96,8 +51,8 @@ void ProcessMouse(WGame &game) {
diffx = 0.0f;
diffy = 0.0f;
- CamAngleX = 0.0f;
- CamAngleY = 0.0f;
+ game._cameraMan->CamAngleX = 0.0f;
+ game._cameraMan->CamAngleY = 0.0f;
fittedx = 0;
fittedy = 0;
@@ -138,7 +93,7 @@ void ProcessMouse(WGame &game) {
if (mPosy > (int32)windowInfo.height) mPosy = windowInfo.height - 1;
else if (mPosy <= 0) mPosy = 1;
- MoveHeadAngles(diffx, diffy);
+ game._cameraMan->MoveHeadAngles(diffx, diffy);
}
/* -----------------19/10/98 15.18-------------------
* DInputMouseGetCoords
diff --git a/engines/watchmaker/ll/ll_mouse.h b/engines/watchmaker/ll/ll_mouse.h
index 9f244b64693..63a872d7a2e 100644
--- a/engines/watchmaker/ll/ll_mouse.h
+++ b/engines/watchmaker/ll/ll_mouse.h
@@ -33,7 +33,6 @@ extern int32 mPosy, mPosx, mMoveX, mMoveY, mMove, mCounter, mHotspotX, mHotspotY
extern uint8 bLPressed, bRPressed, mHide;
void ProcessMouse(WGame &game);
void HandleMouseChanges();
-void MoveHeadAngles(t3dF32 diffx, t3dF32 diffy);
} // End of namespace Watchmaker
diff --git a/engines/watchmaker/ll/ll_regen.cpp b/engines/watchmaker/ll/ll_regen.cpp
index 699d7e8c8c2..8930790796e 100644
--- a/engines/watchmaker/ll/ll_regen.cpp
+++ b/engines/watchmaker/ll/ll_regen.cpp
@@ -20,6 +20,7 @@
*/
#include "watchmaker/ll/ll_regen.h"
+#include "watchmaker/classes/do_camera.h"
#include "watchmaker/render.h"
#include "watchmaker/struct.h"
#include "watchmaker/sysdef.h"
@@ -355,7 +356,6 @@ void Add3DStuff(WGame &game) {
DebugVideo(*game._renderer, 1, 600 - 20, "%s (%02d/%02d/%4d - %d.%d)", WM_CUR_VERSION, d, m, yy, h, min);
if (LoaderFlags & T3D_DEBUGMODE) {
- extern uint8 t3dCurCameraIndex;
auto windowInfo = game._renderer->getScreenInfos();
if (CurFps > 100.0f) CurFps = 100.0f;
if (AvgFps > 100.0f) AvgFps = 100.0f;
@@ -373,7 +373,7 @@ void Add3DStuff(WGame &game) {
DebugVideo(*game._renderer, 1, y += 16, "%d,%d: %s (%d %d) %X", game._gameVars.getCurRoomId(), CurObj, ObjectUnderCursor, NextPortalObj, NextPortalAnim, game.init.Obj[CurObj].flags);
// DebugVideo(1,y+=16,"Player: %d %d %d %d",Player->Mesh->BlendPercent,Player->Mesh->CurFrame,Player->Mesh->LastFrame,Player->Walk.CurAction);
DebugVideo(*game._renderer, 1, y += 16, "DialogActive: %d AnimWaitText: %d PlayerInAnim: %d | %d", bDialogActive, bAnimWaitText, bPlayerInAnim, Player->Mesh->CurFrame);
- DebugVideo(*game._renderer, 1, y += 16, "CurCamera %d CurTime %d (%f %f)", t3dCurCameraIndex + 1, t3dCurTime, t3dCurCamera->Source.x, t3dCurCamera->Source.z);
+ DebugVideo(*game._renderer, 1, y += 16, "CurCamera %d CurTime %d (%f %f)", game._cameraMan->getCurCameraIndex() + 1, t3dCurTime, t3dCurCamera->Source.x, t3dCurCamera->Source.z);
// DebugVideo(1,y+=16,"xy(%f %f)",Character[1]->Mesh->Trasl.x,Character[1]->Mesh->Trasl.y);
// DebugVideo(1,y+=16,"xy(%f %f)",Character[2]->Dir.x,Character[2]->Dir.y);
DebugVideo(*game._renderer, 1, y += 16, "bPlayerSuBasamento %d", bPlayerSuBasamento);
diff --git a/engines/watchmaker/ll/ll_util.cpp b/engines/watchmaker/ll/ll_util.cpp
index 00ffa0abc9e..7128be394ea 100644
--- a/engines/watchmaker/ll/ll_util.cpp
+++ b/engines/watchmaker/ll/ll_util.cpp
@@ -544,8 +544,8 @@ void ChangeRoom(WGame &game, Common::String n, uint8 pos, int32 an) {
PortalCrossed = t3dCurRoom;
t3dCurCamera = &t3dCurRoom->CameraTable[0];
t3dVectCopy(&t3dCurCamera->Target, &Player->Mesh->Trasl);
- ResetCameraSource();
- ResetCameraTarget();
+ game._cameraMan->ResetCameraSource();
+ game._cameraMan->ResetCameraTarget();
CurFloorY = t3dCurRoom->PanelHeight[t3dCurRoom->CurLevel];
}
@@ -556,7 +556,7 @@ void ChangeRoom(WGame &game, Common::String n, uint8 pos, int32 an) {
game.UpdateAll();
if (pos)
CharSetPosition(ocCURPLAYER, pos, nullptr);
- ProcessCamera(game);
+ game._cameraMan->ProcessCamera(game);
if (an)
StartAnim(game, an);
}
diff --git a/engines/watchmaker/main.cpp b/engines/watchmaker/main.cpp
index 0874f151d89..a864381068b 100644
--- a/engines/watchmaker/main.cpp
+++ b/engines/watchmaker/main.cpp
@@ -196,7 +196,7 @@ void Render3DEnvironment(WGame &game) {
t3dProcessPortals(); // Processa i portali visibili
- GetRealCharPos(game.init, &cp, ocCURPLAYER, 0);
+ game._cameraMan->GetRealCharPos(game.init, &cp, ocCURPLAYER, 0);
PortalCrossed = t3dCheckPortalCrossed(&cp); // Controlla se ha attraversato portali
if (LoaderFlags & T3D_SKY)
diff --git a/engines/watchmaker/schedule.cpp b/engines/watchmaker/schedule.cpp
index 965a5e42127..c6142883f70 100644
--- a/engines/watchmaker/schedule.cpp
+++ b/engines/watchmaker/schedule.cpp
@@ -230,7 +230,7 @@ SUPEREVENT:
break;
case EventClass::MC_CAMERA:
- doCamera(game);
+ game._cameraMan->doCamera(game);
break;
case EventClass::MC_SYSTEM:
diff --git a/engines/watchmaker/walk/ball.cpp b/engines/watchmaker/walk/ball.cpp
index a81daa8ad32..e3c9ef82871 100644
--- a/engines/watchmaker/walk/ball.cpp
+++ b/engines/watchmaker/walk/ball.cpp
@@ -469,7 +469,7 @@ void ProcessGopherCamera(WGame &game) {
zero *= (EYES_HEIGHT * 2.0f);
zero.y = CHEST_HEIGHT;
- GetCameraTarget(game.init, &t3dCurCamera->Target);
+ game._cameraMan->GetCameraTarget(game.init, &t3dCurCamera->Target);
t3dCurCamera->Target.y = LastFloorY + CHEST_HEIGHT;
t3dVectAdd(&t3dCurCamera->Source, &t3dCurCamera->Target, &zero);
Palla50->Flags |= T3D_CHARACTER_HIDE;
@@ -558,7 +558,7 @@ void ProcessGopherCamera(WGame &game) {
}
dist = t3dVectDistance(&t3dCurCamera->Source, &OldBallCameraSource);
if ((dist < HALF_STEP * 30.0f) && OldBallCameraSource.z) {
- ClipGolfCameraMove(&t3dCurCamera->Source, &OldBallCameraSource, &t3dCurCamera->Target);
+ game._cameraMan->ClipGolfCameraMove(&t3dCurCamera->Source, &OldBallCameraSource, &t3dCurCamera->Target);
t3dVectSub(&tmp, &t3dCurCamera->Source, &t3dCurCamera->Target);
t3dVectNormalize(&tmp);
tmp *= dist2;
More information about the Scummvm-git-logs
mailing list