[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ømå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