[Scummvm-git-logs] scummvm master -> 9b20d74486f3b188ef24d7d0555246568be06b64

sev- noreply at scummvm.org
Wed Aug 14 19:52:18 UTC 2024


This automated email contains information about 25 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
e51eac314a DIRECTOR: LINGO: XOBJ: Implement QTVREnter/Exit and remove stubs
e4c63321b8 DIRECTOR: LINGO: XOBJ: Implement QTVROpen/Close and remove stubs
e4a3b8d2bb DIRECTOR: LINGO: XOBJ: Implement IsQTVRMovie and remove stub
aee953ca0b COMMON: FORMATS: Make QTVRType enum public
88a5199398 VIDEO: Implement getQTVRType() function
3cf3b3e9ee DIRECTOR: LINGO: XOBJ: Implement QTVRGetQTVRType and remove stub
63c1deeabd VIDEO: Add get/set methods for panAngle, tiltAngle, FOV
5f186e8553 DIRECTOR: LINGO: XOBJ: Implement view control methods and remove stubs
764e4c15ae COMMON: FORMATS: Make _panoTrack protected
8221cd6df0 VIDEO: Implement NodeData struct and getNodeData method
71c7feaf99 DIRECTOR: LINGO: XOBJ: Implement node control methods and remove stubs
0b0cbd2e0b DIRECTOR: LINGO: XOBJ: Implement QTVRGet/SetQuality and remove stubs
7bd452041b DIRECTOR: LINGO: XOBJ: Implement transition control methods and remove stubs
b61450c8b2 DIRECTOR: LINGO: XOBJ: Implement QTVRGet/SetUpdateMode and remove stubs
2a095e6c87 DIRECTOR: LINGO: XOBJ: Implement QTVRGet/SetVisible and remove stubs
19647ff996 VIDEO: Implement row and column navigation methods
cd85cfb4da DIRECTOR: LINGO: XOBJ: Implement frame navigation methods and remove stubs
4a5f4d250f DIRECTOR: LINGO: XOBJ: Implement MouseOver method and remove stub
9e800a6f29 DIRECTOR: LINGO: XOBJ: Implement MouseDown methods and remove stubs
d237519c1d DIRECTOR: LINGO: XOBJ: Implement new/forget and remove stubs
a1d70a25fd VIDEO: Implement QTVRGet/SetWarpMode methods
6acd9a2659 DIRECTOR: LINGO: XOBJ: Implement QTVRGet/SetWarpMode and remove stubs
ab0bb73456 DIRECTOR: LINGO: Map 'the member of sprite'
a32db29b1b DIRECTOR: LINGO: Map 'scrollTop' entity field
9b20d74486 DIRECTOR: Extend getField to retrieve scrollTop


Commit: e51eac314ae731d146423ca4d7f2255008a1d301
    https://github.com/scummvm/scummvm/commit/e51eac314ae731d146423ca4d7f2255008a1d301
Author: Krish (ganatrakrish2882005 at gmail.com)
Date: 2024-08-14T21:52:03+02:00

Commit Message:
DIRECTOR: LINGO: XOBJ: Implement QTVREnter/Exit and remove stubs

Changed paths:
    engines/director/lingo/xtras/qtvrxtra.cpp


diff --git a/engines/director/lingo/xtras/qtvrxtra.cpp b/engines/director/lingo/xtras/qtvrxtra.cpp
index 6a59aa1aca6..3fbae2c6275 100644
--- a/engines/director/lingo/xtras/qtvrxtra.cpp
+++ b/engines/director/lingo/xtras/qtvrxtra.cpp
@@ -162,7 +162,8 @@ const XlibFileDesc QtvrxtraXtra::fileNames[] = {
 static MethodProto xlibMethods[] = {
 	{ "new",				QtvrxtraXtra::m_new,		 0, 0,	500 },
 	{ "forget",				QtvrxtraXtra::m_forget,		 0, 0,	500 },
-	{ "QTVREnter",			QtvrxtraXtra::m_QTVREnter,	 1, 1,	500 },
+	{ "QTVREnter",			QtvrxtraXtra::m_QTVREnter,	 0, 0,	500 },
+	{ "QTVRExit",			QtvrxtraXtra::m_QTVRExit,	 0, 0,	500 },
 	{ "QTVROpen",				QtvrxtraXtra::m_QTVROpen,		 3, 0,	500 },
 	{ "QTVRClose",				QtvrxtraXtra::m_QTVRClose,		 0, 0,	500 },
 	{ "QTVRUpdate",				QtvrxtraXtra::m_QTVRUpdate,		 0, 0,	500 },
@@ -268,8 +269,18 @@ void QtvrxtraXtra::m_new(int nargs) {
 }
 
 XOBJSTUB(QtvrxtraXtra::m_forget, 0)
-XOBJSTUB(QtvrxtraXtra::m_QTVREnter, 0)
-XOBJSTUB(QtvrxtraXtra::m_QTVRExit, 0)
+
+void QtvrxtraXtra::m_QTVREnter(int nargs) {
+	g_lingo->printArgs("QtvrxtraXtra::m_QTVREnter", nargs);
+	ARGNUMCHECK(0);
+	g_lingo->push(0);
+}
+
+void QtvrxtraXtra::m_QTVRExit(int nargs) {
+	g_lingo->printArgs("QtvrxtraXtra::m_QTVRExit", nargs);
+	ARGNUMCHECK(0);
+}
+
 XOBJSTUB(QtvrxtraXtra::m_QTVROpen, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRClose, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRUpdate, 0)


Commit: e4c63321b83c639465ff6366813cc1bd30ead243
    https://github.com/scummvm/scummvm/commit/e4c63321b83c639465ff6366813cc1bd30ead243
Author: Krish (ganatrakrish2882005 at gmail.com)
Date: 2024-08-14T21:52:03+02:00

Commit Message:
DIRECTOR: LINGO: XOBJ: Implement QTVROpen/Close and remove stubs

Changed paths:
    engines/director/lingo/xtras/qtvrxtra.cpp
    engines/director/lingo/xtras/qtvrxtra.h


diff --git a/engines/director/lingo/xtras/qtvrxtra.cpp b/engines/director/lingo/xtras/qtvrxtra.cpp
index 3fbae2c6275..05884cda340 100644
--- a/engines/director/lingo/xtras/qtvrxtra.cpp
+++ b/engines/director/lingo/xtras/qtvrxtra.cpp
@@ -20,12 +20,14 @@
  */
 
 #include "common/system.h"
+#include "common/tokenizer.h"
 
 #include "director/director.h"
 #include "director/lingo/lingo.h"
 #include "director/lingo/lingo-object.h"
 #include "director/lingo/lingo-utils.h"
 #include "director/lingo/xtras/qtvrxtra.h"
+#include "video/qt_decoder.h"
 
 /**************************************************
  *
@@ -164,7 +166,7 @@ static MethodProto xlibMethods[] = {
 	{ "forget",				QtvrxtraXtra::m_forget,		 0, 0,	500 },
 	{ "QTVREnter",			QtvrxtraXtra::m_QTVREnter,	 0, 0,	500 },
 	{ "QTVRExit",			QtvrxtraXtra::m_QTVRExit,	 0, 0,	500 },
-	{ "QTVROpen",				QtvrxtraXtra::m_QTVROpen,		 3, 0,	500 },
+	{ "QTVROpen",				QtvrxtraXtra::m_QTVROpen,		 3, 3,	500 },
 	{ "QTVRClose",				QtvrxtraXtra::m_QTVRClose,		 0, 0,	500 },
 	{ "QTVRUpdate",				QtvrxtraXtra::m_QTVRUpdate,		 0, 0,	500 },
 	{ "QTVRGetQTVRType",				QtvrxtraXtra::m_QTVRGetQTVRType,		 0, 0,	500 },
@@ -235,6 +237,10 @@ static BuiltinProto xlibBuiltins[] = {
 
 QtvrxtraXtraObject::QtvrxtraXtraObject(ObjectType ObjectType) :Object<QtvrxtraXtraObject>("Qtvrxtra") {
 	_objType = ObjectType;
+
+	_video = nullptr;
+
+	_visible = false;
 }
 
 bool QtvrxtraXtraObject::hasProp(const Common::String &propName) {
@@ -281,8 +287,77 @@ void QtvrxtraXtra::m_QTVRExit(int nargs) {
 	ARGNUMCHECK(0);
 }
 
-XOBJSTUB(QtvrxtraXtra::m_QTVROpen, 0)
-XOBJSTUB(QtvrxtraXtra::m_QTVRClose, 0)
+static Common::Rect stringToRect(const Common::String &rectStr) {
+	Common::StringTokenizer tokenizer(rectStr, Common::String(','));
+	Common::StringArray tokens(tokenizer.split());
+
+	if (tokens.size() != 4) {
+		error("stringToRect(): The string should contain exactly 4 numbers separated by commas!");
+		return {};
+	}
+
+	Common::Rect rect;
+	rect.left = atoi(tokens[0].c_str());
+	rect.top = atoi(tokens[1].c_str());
+	rect.right = atoi(tokens[2].c_str());
+	rect.bottom = atoi(tokens[3].c_str());
+
+	return rect;
+}
+
+void QtvrxtraXtra::m_QTVROpen(int nargs) {
+	g_lingo->printArgs("QtvrxtraXtra::m_QTVROpen", nargs);
+	ARGNUMCHECK(3);
+
+	Common::String visiblityStr = g_lingo->pop().asString();
+	Common::String rectStr = g_lingo->pop().asString();
+	Common::String pathStr = g_lingo->pop().asString();
+
+	QtvrxtraXtraObject *me = (QtvrxtraXtraObject *)g_lingo->_state->me.u.obj;
+
+	if (visiblityStr.equalsIgnoreCase("visible")) {
+		me->_visible = true;
+	} else if (visiblityStr.equalsIgnoreCase("invisible")) {
+		me->_visible = false;
+	} else {
+		Common::String error = Common::String::format("Error: Invalid visibility string: ('%s')!", visiblityStr.c_str());
+		g_lingo->push(error);
+		return;
+	}
+
+	me->_rect = stringToRect(rectStr);
+
+	Common::Path path = findMoviePath(pathStr);
+	if (path.empty()) {
+		Common::String error = Common::String::format("Error: Movie file ('%s') not found!", pathStr.c_str());
+		g_lingo->push(error);
+		return;
+	}
+
+	me->_video = new Video::QuickTimeDecoder();
+	debugC(5, kDebugXObj, "QtvrxtraXtra::m_QTVROpen(): Loading QT file ('%s')", path.toString().c_str());
+	if (!me->_video->loadFile(path)) {
+		Common::String error = Common::String::format("Error: Failed to load movie file ('%s')!", path.toString().c_str());
+		g_lingo->push(error);
+		return;
+	}
+
+	g_lingo->push(Common::String());
+}
+
+void QtvrxtraXtra::m_QTVRClose(int nargs) {
+	g_lingo->printArgs("QtvrxtraXtra::m_QTVRClose", nargs);
+	ARGNUMCHECK(0);
+
+	QtvrxtraXtraObject *me = (QtvrxtraXtraObject *)g_lingo->_state->me.u.obj;
+
+	if (me->_video) {
+		me->_video->close();
+		delete me->_video;
+		me->_video = nullptr;
+	}
+}
+
 XOBJSTUB(QtvrxtraXtra::m_QTVRUpdate, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRGetQTVRType, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRIdle, 0)
diff --git a/engines/director/lingo/xtras/qtvrxtra.h b/engines/director/lingo/xtras/qtvrxtra.h
index 207adc1e560..3c4920f4b61 100644
--- a/engines/director/lingo/xtras/qtvrxtra.h
+++ b/engines/director/lingo/xtras/qtvrxtra.h
@@ -22,6 +22,10 @@
 #ifndef DIRECTOR_LINGO_XTRAS_QTVRXTRA_H
 #define DIRECTOR_LINGO_XTRAS_QTVRXTRA_H
 
+namespace Video {
+class QuickTimeDecoder;
+}
+
 namespace Director {
 
 class QtvrxtraXtraObject : public Object<QtvrxtraXtraObject> {
@@ -30,6 +34,11 @@ public:
 
 	bool hasProp(const Common::String &propName) override;
 	Datum getProp(const Common::String &propName) override;
+
+	Video::QuickTimeDecoder *_video;
+
+	Common::Rect _rect;
+	bool _visible;
 };
 
 namespace QtvrxtraXtra {


Commit: e4a3b8d2bbd5e9da91c97dbfb63959ca3a76c7f1
    https://github.com/scummvm/scummvm/commit/e4a3b8d2bbd5e9da91c97dbfb63959ca3a76c7f1
Author: Krish (ganatrakrish2882005 at gmail.com)
Date: 2024-08-14T21:52:03+02:00

Commit Message:
DIRECTOR: LINGO: XOBJ: Implement IsQTVRMovie and remove stub

Changed paths:
    engines/director/lingo/xtras/qtvrxtra.cpp


diff --git a/engines/director/lingo/xtras/qtvrxtra.cpp b/engines/director/lingo/xtras/qtvrxtra.cpp
index 05884cda340..a921d4ad136 100644
--- a/engines/director/lingo/xtras/qtvrxtra.cpp
+++ b/engines/director/lingo/xtras/qtvrxtra.cpp
@@ -416,6 +416,14 @@ XOBJSTUB(QtvrxtraXtra::m_QTVRGetRolloverHotSpotHandler, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRSetRolloverHotSpotHandler, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRExitMouseOver, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRPassMouseDown, 0)
-XOBJSTUB(QtvrxtraXtra::m_IsQTVRMovie, 0)
+
+void QtvrxtraXtra::m_IsQTVRMovie(int nargs) {
+	g_lingo->printArgs("QtvrxtraXtra::m_IsQTVRMovie", nargs);
+	ARGNUMCHECK(0);
+
+	QtvrxtraXtraObject *me = (QtvrxtraXtraObject *)g_lingo->_state->me.u.obj;
+
+	g_lingo->push((int)(me->_video && me->_video->isVideoLoaded()));
+}
 
 }


Commit: aee953ca0b7d40bd2c8776c08a7604f16b8183ce
    https://github.com/scummvm/scummvm/commit/aee953ca0b7d40bd2c8776c08a7604f16b8183ce
Author: Krish (ganatrakrish2882005 at gmail.com)
Date: 2024-08-14T21:52:03+02:00

Commit Message:
COMMON: FORMATS: Make QTVRType enum public

Changed paths:
    common/formats/quicktime.h


diff --git a/common/formats/quicktime.h b/common/formats/quicktime.h
index 03afae9d98e..5f275cb9eb2 100644
--- a/common/formats/quicktime.h
+++ b/common/formats/quicktime.h
@@ -99,6 +99,12 @@ public:
 	/** Find out if this parser has an open file handle */
 	bool isOpen() const { return _fd != nullptr; }
 
+	enum class QTVRType {
+		OTHER,
+		OBJECT,
+		PANORAMA
+	};
+
 protected:
 	// This is the file handle from which data is read from. It can be the actual file handle or a decompressed stream.
 	SeekableReadStream *_fd;
@@ -340,12 +346,6 @@ protected:
 		float initialVPan;
 	};
 
-	enum class QTVRType {
-		OTHER,
-		OBJECT,
-		PANORAMA
-	};
-
 	virtual SampleDesc *readSampleDesc(Track *track, uint32 format, uint32 descSize) = 0;
 
 	uint32 _timeScale;      // movie time


Commit: 88a5199398545c10f93631a6254cdbf4512f4b7c
    https://github.com/scummvm/scummvm/commit/88a5199398545c10f93631a6254cdbf4512f4b7c
Author: Krish (ganatrakrish2882005 at gmail.com)
Date: 2024-08-14T21:52:03+02:00

Commit Message:
VIDEO: Implement getQTVRType() function

Changed paths:
    video/qt_decoder.h


diff --git a/video/qt_decoder.h b/video/qt_decoder.h
index 32990e66eed..3eeb2992515 100644
--- a/video/qt_decoder.h
+++ b/video/qt_decoder.h
@@ -77,6 +77,7 @@ public:
 	void handleMouseButton(bool isDown, int16 x = -1, int16 y = -1);
 
 	bool isVR() const { return _isVR; }
+	QTVRType getQTVRType() const { return _qtvrType; }
 
 protected:
 	Common::QuickTimeParser::SampleDesc *readSampleDesc(Common::QuickTimeParser::Track *track, uint32 format, uint32 descSize);


Commit: 3cf3b3e9ee7d7101de7b76a95f5dba76d39f1d18
    https://github.com/scummvm/scummvm/commit/3cf3b3e9ee7d7101de7b76a95f5dba76d39f1d18
Author: Krish (ganatrakrish2882005 at gmail.com)
Date: 2024-08-14T21:52:03+02:00

Commit Message:
DIRECTOR: LINGO: XOBJ: Implement QTVRGetQTVRType and remove stub

Changed paths:
    engines/director/lingo/xtras/qtvrxtra.cpp


diff --git a/engines/director/lingo/xtras/qtvrxtra.cpp b/engines/director/lingo/xtras/qtvrxtra.cpp
index a921d4ad136..c02f9b147b5 100644
--- a/engines/director/lingo/xtras/qtvrxtra.cpp
+++ b/engines/director/lingo/xtras/qtvrxtra.cpp
@@ -359,7 +359,27 @@ void QtvrxtraXtra::m_QTVRClose(int nargs) {
 }
 
 XOBJSTUB(QtvrxtraXtra::m_QTVRUpdate, 0)
-XOBJSTUB(QtvrxtraXtra::m_QTVRGetQTVRType, 0)
+
+void QtvrxtraXtra::m_QTVRGetQTVRType(int nargs) {
+	g_lingo->printArgs("QtvrxtraXtra::m_QTVRGetQTVRType", nargs);
+	ARGNUMCHECK(0);
+
+	QtvrxtraXtraObject *me = (QtvrxtraXtraObject *)g_lingo->_state->me.u.obj;
+
+	switch (me->_video->getQTVRType()) {
+	case Common::QuickTimeParser::QTVRType::PANORAMA:
+		g_lingo->push(Common::String("QTVRPanorama"));
+		break;
+	case Common::QuickTimeParser::QTVRType::OBJECT:
+		g_lingo->push(Common::String("QTVRObject"));
+		break;
+	case Common::QuickTimeParser::QTVRType::OTHER:
+	default:
+		g_lingo->push(Common::String("NotAQTVRType"));
+		break;
+	}
+}
+
 XOBJSTUB(QtvrxtraXtra::m_QTVRIdle, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRMouseDown, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRMouseOver, 0)


Commit: 63c1deeabdbc465bc80e367d8336945ac5d8c527
    https://github.com/scummvm/scummvm/commit/63c1deeabdbc465bc80e367d8336945ac5d8c527
Author: Krish (ganatrakrish2882005 at gmail.com)
Date: 2024-08-14T21:52:03+02:00

Commit Message:
VIDEO: Add get/set methods for panAngle, tiltAngle, FOV

Changed paths:
    video/qt_decoder.h


diff --git a/video/qt_decoder.h b/video/qt_decoder.h
index 3eeb2992515..3ff3c73f947 100644
--- a/video/qt_decoder.h
+++ b/video/qt_decoder.h
@@ -76,6 +76,13 @@ public:
 	void handleMouseMove(int16 x, int16 y);
 	void handleMouseButton(bool isDown, int16 x = -1, int16 y = -1);
 
+	float getPanAngle() const { return ((VideoTrackHandler *)_nextVideoTrack)->getPanAngle(); }
+	void setPanAngle(float panAngle) { ((VideoTrackHandler *)_nextVideoTrack)->setPanAngle(panAngle); }
+	float getTiltAngle() const { return ((VideoTrackHandler *)_nextVideoTrack)->getTiltAngle(); }
+	void setTiltAngle(float tiltAngle) { ((VideoTrackHandler *)_nextVideoTrack)->setTiltAngle(tiltAngle); }
+	float getFOV() const { return ((VideoTrackHandler *)_nextVideoTrack)->getFOV(); }
+	void setFOV(float fov) { ((VideoTrackHandler *)_nextVideoTrack)->setFOV(fov); }
+
 	bool isVR() const { return _isVR; }
 	QTVRType getQTVRType() const { return _qtvrType; }
 
@@ -164,6 +171,13 @@ private:
 		Common::Rational getScaledWidth() const;
 		Common::Rational getScaledHeight() const;
 
+		float getPanAngle() const { return _panAngle; }
+		void setPanAngle(float panAngle) { _panAngle = panAngle; }
+		float getTiltAngle() const { return _tiltAngle; }
+		void setTiltAngle(float tiltAngle) { _tiltAngle = tiltAngle; }
+		float getFOV() const { return _fov; }
+		void setFOV(float fov) { _fov = fov; }
+
 	private:
 		QuickTimeDecoder *_decoder;
 		Common::QuickTimeParser::Track *_parent;
@@ -177,6 +191,10 @@ private:
 		mutable bool _dirtyPalette;
 		bool _reversed;
 
+		float _panAngle;
+		float _tiltAngle;
+		float _fov;
+
 		void constructPanorama();
 		void projectPanorama();
 


Commit: 5f186e8553621952c91b22f0c0091363534a252b
    https://github.com/scummvm/scummvm/commit/5f186e8553621952c91b22f0c0091363534a252b
Author: Krish (ganatrakrish2882005 at gmail.com)
Date: 2024-08-14T21:52:03+02:00

Commit Message:
DIRECTOR: LINGO: XOBJ: Implement view control methods and remove stubs

Changed paths:
    engines/director/lingo/xtras/qtvrxtra.cpp


diff --git a/engines/director/lingo/xtras/qtvrxtra.cpp b/engines/director/lingo/xtras/qtvrxtra.cpp
index c02f9b147b5..896fa392999 100644
--- a/engines/director/lingo/xtras/qtvrxtra.cpp
+++ b/engines/director/lingo/xtras/qtvrxtra.cpp
@@ -174,11 +174,11 @@ static MethodProto xlibMethods[] = {
 	{ "QTVRMouseDown",				QtvrxtraXtra::m_QTVRMouseDown,		 0, 0,	500 },
 	{ "QTVRMouseOver",				QtvrxtraXtra::m_QTVRMouseOver,		 0, 0,	500 },
 	{ "QTVRGetPanAngle",				QtvrxtraXtra::m_QTVRGetPanAngle,		 0, 0,	500 },
-	{ "QTVRSetPanAngle",				QtvrxtraXtra::m_QTVRSetPanAngle,		 1, 0,	500 },
+	{ "QTVRSetPanAngle",				QtvrxtraXtra::m_QTVRSetPanAngle,		 1, 1,	500 },
 	{ "QTVRGetTiltAngle",				QtvrxtraXtra::m_QTVRGetTiltAngle,		 0, 0,	500 },
-	{ "QTVRSetTiltAngle",				QtvrxtraXtra::m_QTVRSetTiltAngle,		 1, 0,	500 },
+	{ "QTVRSetTiltAngle",				QtvrxtraXtra::m_QTVRSetTiltAngle,		 1, 1,	500 },
 	{ "QTVRGetFOV",				QtvrxtraXtra::m_QTVRGetFOV,		 0, 0,	500 },
-	{ "QTVRSetFOV",				QtvrxtraXtra::m_QTVRSetFOV,		 1, 0,	500 },
+	{ "QTVRSetFOV",				QtvrxtraXtra::m_QTVRSetFOV,		 1, 1,	500 },
 	{ "QTVRGetClickLoc",				QtvrxtraXtra::m_QTVRGetClickLoc,		 0, 0,	500 },
 	{ "QTVRSetClickLoc",				QtvrxtraXtra::m_QTVRSetClickLoc,		 1, 0,	500 },
 	{ "QTVRGetClickPanAngles",				QtvrxtraXtra::m_QTVRGetClickPanAngles,		 0, 0,	500 },
@@ -383,12 +383,61 @@ void QtvrxtraXtra::m_QTVRGetQTVRType(int nargs) {
 XOBJSTUB(QtvrxtraXtra::m_QTVRIdle, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRMouseDown, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRMouseOver, 0)
-XOBJSTUB(QtvrxtraXtra::m_QTVRGetPanAngle, 0)
-XOBJSTUB(QtvrxtraXtra::m_QTVRSetPanAngle, 0)
-XOBJSTUB(QtvrxtraXtra::m_QTVRGetTiltAngle, 0)
-XOBJSTUB(QtvrxtraXtra::m_QTVRSetTiltAngle, 0)
-XOBJSTUB(QtvrxtraXtra::m_QTVRGetFOV, 0)
-XOBJSTUB(QtvrxtraXtra::m_QTVRSetFOV, 0)
+
+void QtvrxtraXtra::m_QTVRGetPanAngle(int nargs) {
+	g_lingo->printArgs("QtvrxtraXtra::m_QTVRGetPanAngle", nargs);
+	ARGNUMCHECK(0);
+
+	QtvrxtraXtraObject *me = (QtvrxtraXtraObject *)g_lingo->_state->me.u.obj;
+
+	g_lingo->push(Common::String::format("%f", me->_video->getPanAngle()));
+}
+
+void QtvrxtraXtra::m_QTVRSetPanAngle(int nargs) {
+	g_lingo->printArgs("QtvrxtraXtra::m_QTVRSetPanAngle", nargs);
+	ARGNUMCHECK(1);
+
+	QtvrxtraXtraObject *me = (QtvrxtraXtraObject *)g_lingo->_state->me.u.obj;
+
+	me->_video->setPanAngle(atof(g_lingo->pop().asString().c_str()));
+}
+
+void QtvrxtraXtra::m_QTVRGetTiltAngle(int nargs) {
+	g_lingo->printArgs("QtvrxtraXtra::m_QTVRGetTiltAngle", nargs);
+	ARGNUMCHECK(0);
+
+	QtvrxtraXtraObject *me = (QtvrxtraXtraObject *)g_lingo->_state->me.u.obj;
+
+	g_lingo->push(Common::String::format("%f", me->_video->getTiltAngle()));
+}
+
+void QtvrxtraXtra::m_QTVRSetTiltAngle(int nargs) {
+	g_lingo->printArgs("QtvrxtraXtra::m_QTVRSetTiltAngle", nargs);
+	ARGNUMCHECK(1);
+
+	QtvrxtraXtraObject *me = (QtvrxtraXtraObject *)g_lingo->_state->me.u.obj;
+
+	me->_video->setTiltAngle(atof(g_lingo->pop().asString().c_str()));
+}
+
+void QtvrxtraXtra::m_QTVRGetFOV(int nargs) {
+	g_lingo->printArgs("QtvrxtraXtra::m_QTVRGetFOV", nargs);
+	ARGNUMCHECK(0);
+
+	QtvrxtraXtraObject *me = (QtvrxtraXtraObject *)g_lingo->_state->me.u.obj;
+
+	g_lingo->push(Common::String::format("%f", me->_video->getFOV()));
+}
+
+void QtvrxtraXtra::m_QTVRSetFOV(int nargs) {
+	g_lingo->printArgs("QtvrxtraXtra::m_QTVRSetFOV", nargs);
+	ARGNUMCHECK(1);
+
+	QtvrxtraXtraObject *me = (QtvrxtraXtraObject *)g_lingo->_state->me.u.obj;
+
+	me->_video->setFOV(atof(g_lingo->pop().asString().c_str()));
+}
+
 XOBJSTUB(QtvrxtraXtra::m_QTVRGetClickLoc, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRSetClickLoc, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRGetClickPanAngles, 0)


Commit: 764e4c15aea1bfd4765e1d7311a4e839edf3adee
    https://github.com/scummvm/scummvm/commit/764e4c15aea1bfd4765e1d7311a4e839edf3adee
Author: Krish (ganatrakrish2882005 at gmail.com)
Date: 2024-08-14T21:52:03+02:00

Commit Message:
COMMON: FORMATS: Make _panoTrack protected

Changed paths:
    common/formats/quicktime.h


diff --git a/common/formats/quicktime.h b/common/formats/quicktime.h
index 5f275cb9eb2..4abce63dd2b 100644
--- a/common/formats/quicktime.h
+++ b/common/formats/quicktime.h
@@ -358,6 +358,8 @@ protected:
 	uint16 _winX;
 	uint16 _winY;
 
+	Track *_panoTrack;
+
 	void init();
 
 private:
@@ -378,8 +380,6 @@ private:
 	MacResManager *_resFork;
 	bool _foundMOOV;
 
-	Track *_panoTrack;
-
 	void initParseTable();
 
 	bool parsePanoramaAtoms();


Commit: 8221cd6df07d8d7d2c2f3b0101a6e6a2a0f650d5
    https://github.com/scummvm/scummvm/commit/8221cd6df07d8d7d2c2f3b0101a6e6a2a0f650d5
Author: Krish (ganatrakrish2882005 at gmail.com)
Date: 2024-08-14T21:52:03+02:00

Commit Message:
VIDEO: Implement NodeData struct and getNodeData method

Changed paths:
    video/qt_decoder.cpp
    video/qt_decoder.h


diff --git a/video/qt_decoder.cpp b/video/qt_decoder.cpp
index 1168f45f74c..dea508c00f6 100644
--- a/video/qt_decoder.cpp
+++ b/video/qt_decoder.cpp
@@ -671,6 +671,28 @@ void QuickTimeDecoder::handleMouseButton(bool isDown, int16 x, int16 y) {
 	}
 }
 
+QuickTimeDecoder::NodeData QuickTimeDecoder::getNodeData(uint32 nodeID) {
+	for (const auto &sample : _panoTrack->panoSamples) {
+		if (sample.hdr.nodeID == nodeID) {
+			return {
+				nodeID,
+				sample.hdr.defHPan,
+				sample.hdr.defVPan,
+				sample.hdr.defZoom,
+				sample.hdr.minHPan,
+				sample.hdr.minVPan,
+				sample.hdr.maxHPan,
+				sample.hdr.maxVPan,
+				sample.hdr.minZoom,
+				sample.strTable.getString(sample.hdr.nameStrOffset)};
+		}
+	}
+
+	error("QuickTimeDecoder::getNodeData(): Node with nodeID %d not found!", nodeID);
+
+	return {};
+}
+
 Audio::Timestamp QuickTimeDecoder::VideoTrackHandler::getFrameTime(uint frame) const {
 	// TODO: This probably doesn't work right with edit lists
 	int cumulativeDuration = 0;
diff --git a/video/qt_decoder.h b/video/qt_decoder.h
index 3ff3c73f947..a645cb4b76d 100644
--- a/video/qt_decoder.h
+++ b/video/qt_decoder.h
@@ -86,6 +86,24 @@ public:
 	bool isVR() const { return _isVR; }
 	QTVRType getQTVRType() const { return _qtvrType; }
 
+	struct NodeData {
+		uint32 nodeID;
+
+		float defHPan;
+		float defVPan;
+		float defZoom;
+
+		float minHPan;
+		float minVPan;
+		float maxHPan;
+		float maxVPan;
+		float minZoom;
+
+		Common::String name;
+	};
+
+	NodeData getNodeData(uint32 nodeID);
+
 protected:
 	Common::QuickTimeParser::SampleDesc *readSampleDesc(Common::QuickTimeParser::Track *track, uint32 format, uint32 descSize);
 


Commit: 71c7feaf99f01b898a274138aeb4e4d6166f56d7
    https://github.com/scummvm/scummvm/commit/71c7feaf99f01b898a274138aeb4e4d6166f56d7
Author: Krish (ganatrakrish2882005 at gmail.com)
Date: 2024-08-14T21:52:03+02:00

Commit Message:
DIRECTOR: LINGO: XOBJ: Implement node control methods and remove stubs

Changed paths:
    engines/director/lingo/xtras/qtvrxtra.cpp
    engines/director/lingo/xtras/qtvrxtra.h


diff --git a/engines/director/lingo/xtras/qtvrxtra.cpp b/engines/director/lingo/xtras/qtvrxtra.cpp
index 896fa392999..8057d69117e 100644
--- a/engines/director/lingo/xtras/qtvrxtra.cpp
+++ b/engines/director/lingo/xtras/qtvrxtra.cpp
@@ -191,7 +191,7 @@ static MethodProto xlibMethods[] = {
 	{ "QTVRGetObjectViewAngles",				QtvrxtraXtra::m_QTVRGetObjectViewAngles,		 0, 0,	500 },
 	{ "QTVRGetObjectZoomRect",				QtvrxtraXtra::m_QTVRGetObjectZoomRect,		 0, 0,	500 },
 	{ "QTVRGetNodeID",				QtvrxtraXtra::m_QTVRGetNodeID,		 0, 0,	500 },
-	{ "QTVRSetNodeID",				QtvrxtraXtra::m_QTVRSetNodeID,		 1, 0,	500 },
+	{ "QTVRSetNodeID",				QtvrxtraXtra::m_QTVRSetNodeID,		 1, 1,	500 },
 	{ "QTVRGetNodeName",				QtvrxtraXtra::m_QTVRGetNodeName,		 0, 0,	500 },
 	{ "QTVRGetQuality",				QtvrxtraXtra::m_QTVRGetQuality,		 0, 0,	500 },
 	{ "QTVRSetQuality",				QtvrxtraXtra::m_QTVRSetQuality,		 1, 0,	500 },
@@ -449,9 +449,41 @@ XOBJSTUB(QtvrxtraXtra::m_QTVRGetHotSpotType, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRGetHotSpotViewAngles, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRGetObjectViewAngles, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRGetObjectZoomRect, 0)
-XOBJSTUB(QtvrxtraXtra::m_QTVRGetNodeID, 0)
-XOBJSTUB(QtvrxtraXtra::m_QTVRSetNodeID, 0)
-XOBJSTUB(QtvrxtraXtra::m_QTVRGetNodeName, 0)
+
+void QtvrxtraXtra::m_QTVRGetNodeID(int nargs) {
+	g_lingo->printArgs("QtvrxtraXtra::m_QTVRGetNodeID", nargs);
+	ARGNUMCHECK(0);
+
+	QtvrxtraXtraObject *me = (QtvrxtraXtraObject *)g_lingo->_state->me.u.obj;
+
+	g_lingo->push((int)me->_currentNode.nodeID);
+}
+
+void QtvrxtraXtra::m_QTVRSetNodeID(int nargs) {
+	g_lingo->printArgs("QtvrxtraXtra::m_QTVRSetNodeID", nargs);
+	ARGNUMCHECK(1);
+
+	QtvrxtraXtraObject *me = (QtvrxtraXtraObject *)g_lingo->_state->me.u.obj;
+
+	Video::QuickTimeDecoder::NodeData newNode = me->_video->getNodeData(g_lingo->pop().asInt());
+
+	if (newNode.nodeID)
+		me->_currentNode = newNode;
+
+	me->_video->setPanAngle(me->_currentNode.defHPan);
+	me->_video->setTiltAngle(me->_currentNode.defVPan);
+	me->_video->setFOV(me->_currentNode.defZoom);
+}
+
+void QtvrxtraXtra::m_QTVRGetNodeName(int nargs) {
+	g_lingo->printArgs("QtvrxtraXtra::m_QTVRGetNodeName", nargs);
+	ARGNUMCHECK(0);
+
+	QtvrxtraXtraObject *me = (QtvrxtraXtraObject *)g_lingo->_state->me.u.obj;
+
+	g_lingo->push(me->_currentNode.name);
+}
+
 XOBJSTUB(QtvrxtraXtra::m_QTVRGetQuality, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRSetQuality, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRGetTransitionMode, 0)
diff --git a/engines/director/lingo/xtras/qtvrxtra.h b/engines/director/lingo/xtras/qtvrxtra.h
index 3c4920f4b61..f79952730b8 100644
--- a/engines/director/lingo/xtras/qtvrxtra.h
+++ b/engines/director/lingo/xtras/qtvrxtra.h
@@ -22,9 +22,7 @@
 #ifndef DIRECTOR_LINGO_XTRAS_QTVRXTRA_H
 #define DIRECTOR_LINGO_XTRAS_QTVRXTRA_H
 
-namespace Video {
-class QuickTimeDecoder;
-}
+#include "video/qt_decoder.h"
 
 namespace Director {
 
@@ -39,6 +37,8 @@ public:
 
 	Common::Rect _rect;
 	bool _visible;
+
+	Video::QuickTimeDecoder::NodeData _currentNode;
 };
 
 namespace QtvrxtraXtra {


Commit: 0b0cbd2e0b720d970ac596e01765dec7d57089d3
    https://github.com/scummvm/scummvm/commit/0b0cbd2e0b720d970ac596e01765dec7d57089d3
Author: Krish (ganatrakrish2882005 at gmail.com)
Date: 2024-08-14T21:52:03+02:00

Commit Message:
DIRECTOR: LINGO: XOBJ: Implement QTVRGet/SetQuality and remove stubs

Changed paths:
    engines/director/lingo/xtras/qtvrxtra.cpp
    engines/director/lingo/xtras/qtvrxtra.h


diff --git a/engines/director/lingo/xtras/qtvrxtra.cpp b/engines/director/lingo/xtras/qtvrxtra.cpp
index 8057d69117e..a9a905c1f19 100644
--- a/engines/director/lingo/xtras/qtvrxtra.cpp
+++ b/engines/director/lingo/xtras/qtvrxtra.cpp
@@ -194,7 +194,7 @@ static MethodProto xlibMethods[] = {
 	{ "QTVRSetNodeID",				QtvrxtraXtra::m_QTVRSetNodeID,		 1, 1,	500 },
 	{ "QTVRGetNodeName",				QtvrxtraXtra::m_QTVRGetNodeName,		 0, 0,	500 },
 	{ "QTVRGetQuality",				QtvrxtraXtra::m_QTVRGetQuality,		 0, 0,	500 },
-	{ "QTVRSetQuality",				QtvrxtraXtra::m_QTVRSetQuality,		 1, 0,	500 },
+	{ "QTVRSetQuality",				QtvrxtraXtra::m_QTVRSetQuality,		 1, 1,	500 },
 	{ "QTVRGetTransitionMode",				QtvrxtraXtra::m_QTVRGetTransitionMode,		 0, 0,	500 },
 	{ "QTVRSetTransitionMode",				QtvrxtraXtra::m_QTVRSetTransitionMode,		 1, 0,	500 },
 	{ "QTVRGetTransitionSpeed",				QtvrxtraXtra::m_QTVRGetTransitionSpeed,		 0, 0,	500 },
@@ -241,6 +241,7 @@ QtvrxtraXtraObject::QtvrxtraXtraObject(ObjectType ObjectType) :Object<QtvrxtraXt
 	_video = nullptr;
 
 	_visible = false;
+	_quality = 0.0f;
 }
 
 bool QtvrxtraXtraObject::hasProp(const Common::String &propName) {
@@ -484,8 +485,24 @@ void QtvrxtraXtra::m_QTVRGetNodeName(int nargs) {
 	g_lingo->push(me->_currentNode.name);
 }
 
-XOBJSTUB(QtvrxtraXtra::m_QTVRGetQuality, 0)
-XOBJSTUB(QtvrxtraXtra::m_QTVRSetQuality, 0)
+void QtvrxtraXtra::m_QTVRGetQuality(int nargs) {
+	g_lingo->printArgs("QtvrxtraXtra::m_QTVRGetQuality", nargs);
+	ARGNUMCHECK(0);
+
+	QtvrxtraXtraObject *me = (QtvrxtraXtraObject *)g_lingo->_state->me.u.obj;
+
+	g_lingo->push(Common::String::format("%f", me->_quality));
+}
+
+void QtvrxtraXtra::m_QTVRSetQuality(int nargs) {
+	g_lingo->printArgs("QtvrxtraXtra::m_QTVRSetQuality", nargs);
+	ARGNUMCHECK(1);
+
+	QtvrxtraXtraObject *me = (QtvrxtraXtraObject *)g_lingo->_state->me.u.obj;
+
+	me->_quality = atof(g_lingo->pop().asString().c_str());
+}
+
 XOBJSTUB(QtvrxtraXtra::m_QTVRGetTransitionMode, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRSetTransitionMode, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRGetTransitionSpeed, 0)
diff --git a/engines/director/lingo/xtras/qtvrxtra.h b/engines/director/lingo/xtras/qtvrxtra.h
index f79952730b8..0995d779c85 100644
--- a/engines/director/lingo/xtras/qtvrxtra.h
+++ b/engines/director/lingo/xtras/qtvrxtra.h
@@ -37,6 +37,7 @@ public:
 
 	Common::Rect _rect;
 	bool _visible;
+	float _quality;
 
 	Video::QuickTimeDecoder::NodeData _currentNode;
 };


Commit: 7bd452041bf157858c37c148c568323132663a92
    https://github.com/scummvm/scummvm/commit/7bd452041bf157858c37c148c568323132663a92
Author: Krish (ganatrakrish2882005 at gmail.com)
Date: 2024-08-14T21:52:03+02:00

Commit Message:
DIRECTOR: LINGO: XOBJ: Implement transition control methods and remove stubs

Changed paths:
    engines/director/lingo/xtras/qtvrxtra.cpp
    engines/director/lingo/xtras/qtvrxtra.h


diff --git a/engines/director/lingo/xtras/qtvrxtra.cpp b/engines/director/lingo/xtras/qtvrxtra.cpp
index a9a905c1f19..1bcf8930df0 100644
--- a/engines/director/lingo/xtras/qtvrxtra.cpp
+++ b/engines/director/lingo/xtras/qtvrxtra.cpp
@@ -196,9 +196,9 @@ static MethodProto xlibMethods[] = {
 	{ "QTVRGetQuality",				QtvrxtraXtra::m_QTVRGetQuality,		 0, 0,	500 },
 	{ "QTVRSetQuality",				QtvrxtraXtra::m_QTVRSetQuality,		 1, 1,	500 },
 	{ "QTVRGetTransitionMode",				QtvrxtraXtra::m_QTVRGetTransitionMode,		 0, 0,	500 },
-	{ "QTVRSetTransitionMode",				QtvrxtraXtra::m_QTVRSetTransitionMode,		 1, 0,	500 },
+	{ "QTVRSetTransitionMode",				QtvrxtraXtra::m_QTVRSetTransitionMode,		 1, 1,	500 },
 	{ "QTVRGetTransitionSpeed",				QtvrxtraXtra::m_QTVRGetTransitionSpeed,		 0, 0,	500 },
-	{ "QTVRSetTransitionSpeed",				QtvrxtraXtra::m_QTVRSetTransitionSpeed,		 1, 0,	500 },
+	{ "QTVRSetTransitionSpeed",				QtvrxtraXtra::m_QTVRSetTransitionSpeed,		 1, 1,	500 },
 	{ "QTVRGetUpdateMode",				QtvrxtraXtra::m_QTVRGetUpdateMode,		 0, 0,	500 },
 	{ "QTVRSetUpdateMode",				QtvrxtraXtra::m_QTVRSetUpdateMode,		 1, 0,	500 },
 	{ "QTVRGetVisible",				QtvrxtraXtra::m_QTVRGetVisible,		 0, 0,	500 },
@@ -242,6 +242,9 @@ QtvrxtraXtraObject::QtvrxtraXtraObject(ObjectType ObjectType) :Object<QtvrxtraXt
 
 	_visible = false;
 	_quality = 0.0f;
+
+	_transitionMode = "normal";
+	_transitionSpeed = 1.0f;
 }
 
 bool QtvrxtraXtraObject::hasProp(const Common::String &propName) {
@@ -503,10 +506,42 @@ void QtvrxtraXtra::m_QTVRSetQuality(int nargs) {
 	me->_quality = atof(g_lingo->pop().asString().c_str());
 }
 
-XOBJSTUB(QtvrxtraXtra::m_QTVRGetTransitionMode, 0)
-XOBJSTUB(QtvrxtraXtra::m_QTVRSetTransitionMode, 0)
-XOBJSTUB(QtvrxtraXtra::m_QTVRGetTransitionSpeed, 0)
-XOBJSTUB(QtvrxtraXtra::m_QTVRSetTransitionSpeed, 0)
+void QtvrxtraXtra::m_QTVRGetTransitionMode(int nargs) {
+	g_lingo->printArgs("QtvrxtraXtra::m_QTVRGetTransitionMode", nargs);
+	ARGNUMCHECK(0);
+
+	QtvrxtraXtraObject *me = (QtvrxtraXtraObject *)g_lingo->_state->me.u.obj;
+
+	me->_transitionMode = g_lingo->pop().asString();
+}
+
+void QtvrxtraXtra::m_QTVRSetTransitionMode(int nargs) {
+	g_lingo->printArgs("QtvrxtraXtra::m_QTVRSetTransitionMode", nargs);
+	ARGNUMCHECK(1);
+
+	QtvrxtraXtraObject *me = (QtvrxtraXtraObject *)g_lingo->_state->me.u.obj;
+
+	g_lingo->push(me->_transitionMode);
+}
+
+void QtvrxtraXtra::m_QTVRGetTransitionSpeed(int nargs) {
+	g_lingo->printArgs("QtvrxtraXtra::m_QTVRGetTransitionSpeed", nargs);
+	ARGNUMCHECK(0);
+
+	QtvrxtraXtraObject *me = (QtvrxtraXtraObject *)g_lingo->_state->me.u.obj;
+
+	g_lingo->push(Common::String::format("%f", me->_transitionSpeed));
+}
+
+void QtvrxtraXtra::m_QTVRSetTransitionSpeed(int nargs) {
+	g_lingo->printArgs("QtvrxtraXtra::m_QTVRSetTransitionSpeed", nargs);
+	ARGNUMCHECK(1);
+
+	QtvrxtraXtraObject *me = (QtvrxtraXtraObject *)g_lingo->_state->me.u.obj;
+
+	me->_transitionSpeed = atof(g_lingo->pop().asString().c_str());
+}
+
 XOBJSTUB(QtvrxtraXtra::m_QTVRGetUpdateMode, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRSetUpdateMode, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRGetVisible, 0)
diff --git a/engines/director/lingo/xtras/qtvrxtra.h b/engines/director/lingo/xtras/qtvrxtra.h
index 0995d779c85..7095160925d 100644
--- a/engines/director/lingo/xtras/qtvrxtra.h
+++ b/engines/director/lingo/xtras/qtvrxtra.h
@@ -40,6 +40,9 @@ public:
 	float _quality;
 
 	Video::QuickTimeDecoder::NodeData _currentNode;
+
+	Common::String _transitionMode;
+	float _transitionSpeed;
 };
 
 namespace QtvrxtraXtra {


Commit: b61450c8b25271fa51547d0b4db7a9b4869b29bc
    https://github.com/scummvm/scummvm/commit/b61450c8b25271fa51547d0b4db7a9b4869b29bc
Author: Krish (ganatrakrish2882005 at gmail.com)
Date: 2024-08-14T21:52:03+02:00

Commit Message:
DIRECTOR: LINGO: XOBJ: Implement QTVRGet/SetUpdateMode and remove stubs

Changed paths:
    engines/director/lingo/xtras/qtvrxtra.cpp
    engines/director/lingo/xtras/qtvrxtra.h


diff --git a/engines/director/lingo/xtras/qtvrxtra.cpp b/engines/director/lingo/xtras/qtvrxtra.cpp
index 1bcf8930df0..88eb6b93fc8 100644
--- a/engines/director/lingo/xtras/qtvrxtra.cpp
+++ b/engines/director/lingo/xtras/qtvrxtra.cpp
@@ -200,7 +200,7 @@ static MethodProto xlibMethods[] = {
 	{ "QTVRGetTransitionSpeed",				QtvrxtraXtra::m_QTVRGetTransitionSpeed,		 0, 0,	500 },
 	{ "QTVRSetTransitionSpeed",				QtvrxtraXtra::m_QTVRSetTransitionSpeed,		 1, 1,	500 },
 	{ "QTVRGetUpdateMode",				QtvrxtraXtra::m_QTVRGetUpdateMode,		 0, 0,	500 },
-	{ "QTVRSetUpdateMode",				QtvrxtraXtra::m_QTVRSetUpdateMode,		 1, 0,	500 },
+	{ "QTVRSetUpdateMode",				QtvrxtraXtra::m_QTVRSetUpdateMode,		 1, 1,	500 },
 	{ "QTVRGetVisible",				QtvrxtraXtra::m_QTVRGetVisible,		 0, 0,	500 },
 	{ "QTVRSetVisible",				QtvrxtraXtra::m_QTVRSetVisible,		 1, 0,	500 },
 	{ "QTVRGetWarpMode",				QtvrxtraXtra::m_QTVRGetWarpMode,		 0, 0,	500 },
@@ -245,6 +245,8 @@ QtvrxtraXtraObject::QtvrxtraXtraObject(ObjectType ObjectType) :Object<QtvrxtraXt
 
 	_transitionMode = "normal";
 	_transitionSpeed = 1.0f;
+
+	_updateMode = "normal";
 }
 
 bool QtvrxtraXtraObject::hasProp(const Common::String &propName) {
@@ -542,8 +544,24 @@ void QtvrxtraXtra::m_QTVRSetTransitionSpeed(int nargs) {
 	me->_transitionSpeed = atof(g_lingo->pop().asString().c_str());
 }
 
-XOBJSTUB(QtvrxtraXtra::m_QTVRGetUpdateMode, 0)
-XOBJSTUB(QtvrxtraXtra::m_QTVRSetUpdateMode, 0)
+void QtvrxtraXtra::m_QTVRGetUpdateMode(int nargs) {
+	g_lingo->printArgs("QtvrxtraXtra::m_QTVRGetUpdateMode", nargs);
+	ARGNUMCHECK(0);
+
+	QtvrxtraXtraObject *me = (QtvrxtraXtraObject *)g_lingo->_state->me.u.obj;
+
+	g_lingo->push(me->_updateMode);
+}
+
+void QtvrxtraXtra::m_QTVRSetUpdateMode(int nargs) {
+	g_lingo->printArgs("QtvrxtraXtra::m_QTVRSetUpdateMode", nargs);
+	ARGNUMCHECK(1);
+
+	QtvrxtraXtraObject *me = (QtvrxtraXtraObject *)g_lingo->_state->me.u.obj;
+
+	me->_updateMode = g_lingo->pop().asString();
+}
+
 XOBJSTUB(QtvrxtraXtra::m_QTVRGetVisible, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRSetVisible, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRGetWarpMode, 0)
diff --git a/engines/director/lingo/xtras/qtvrxtra.h b/engines/director/lingo/xtras/qtvrxtra.h
index 7095160925d..ec02bcb8921 100644
--- a/engines/director/lingo/xtras/qtvrxtra.h
+++ b/engines/director/lingo/xtras/qtvrxtra.h
@@ -43,6 +43,8 @@ public:
 
 	Common::String _transitionMode;
 	float _transitionSpeed;
+
+	Common::String _updateMode;
 };
 
 namespace QtvrxtraXtra {


Commit: 2a095e6c877348e04e13c85776ed218cdfb459af
    https://github.com/scummvm/scummvm/commit/2a095e6c877348e04e13c85776ed218cdfb459af
Author: Krish (ganatrakrish2882005 at gmail.com)
Date: 2024-08-14T21:52:03+02:00

Commit Message:
DIRECTOR: LINGO: XOBJ: Implement QTVRGet/SetVisible and remove stubs

Changed paths:
    engines/director/lingo/xtras/qtvrxtra.cpp


diff --git a/engines/director/lingo/xtras/qtvrxtra.cpp b/engines/director/lingo/xtras/qtvrxtra.cpp
index 88eb6b93fc8..9f91236ecd5 100644
--- a/engines/director/lingo/xtras/qtvrxtra.cpp
+++ b/engines/director/lingo/xtras/qtvrxtra.cpp
@@ -202,7 +202,7 @@ static MethodProto xlibMethods[] = {
 	{ "QTVRGetUpdateMode",				QtvrxtraXtra::m_QTVRGetUpdateMode,		 0, 0,	500 },
 	{ "QTVRSetUpdateMode",				QtvrxtraXtra::m_QTVRSetUpdateMode,		 1, 1,	500 },
 	{ "QTVRGetVisible",				QtvrxtraXtra::m_QTVRGetVisible,		 0, 0,	500 },
-	{ "QTVRSetVisible",				QtvrxtraXtra::m_QTVRSetVisible,		 1, 0,	500 },
+	{ "QTVRSetVisible",				QtvrxtraXtra::m_QTVRSetVisible,		 1, 1,	500 },
 	{ "QTVRGetWarpMode",				QtvrxtraXtra::m_QTVRGetWarpMode,		 0, 0,	500 },
 	{ "QTVRSetWarpMode",				QtvrxtraXtra::m_QTVRSetWarpMode,		 1, 0,	500 },
 	{ "QTVRCollapseToHotSpotRgn",				QtvrxtraXtra::m_QTVRCollapseToHotSpotRgn,		 0, 0,	500 },
@@ -562,8 +562,24 @@ void QtvrxtraXtra::m_QTVRSetUpdateMode(int nargs) {
 	me->_updateMode = g_lingo->pop().asString();
 }
 
-XOBJSTUB(QtvrxtraXtra::m_QTVRGetVisible, 0)
-XOBJSTUB(QtvrxtraXtra::m_QTVRSetVisible, 0)
+void QtvrxtraXtra::m_QTVRGetVisible(int nargs) {
+	g_lingo->printArgs("QtvrxtraXtra::m_QTVRGetVisible", nargs);
+	ARGNUMCHECK(0);
+
+	QtvrxtraXtraObject *me = (QtvrxtraXtraObject *)g_lingo->_state->me.u.obj;
+
+	g_lingo->push((int)me->_visible);
+}
+
+void QtvrxtraXtra::m_QTVRSetVisible(int nargs) {
+	g_lingo->printArgs("QtvrxtraXtra::m_QTVRSetVisible", nargs);
+	ARGNUMCHECK(1);
+
+	QtvrxtraXtraObject *me = (QtvrxtraXtraObject *)g_lingo->_state->me.u.obj;
+
+	me->_visible = (bool)g_lingo->pop().asInt();
+}
+
 XOBJSTUB(QtvrxtraXtra::m_QTVRGetWarpMode, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRSetWarpMode, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRCollapseToHotSpotRgn, 0)


Commit: 19647ff996187421a409698c03746db43b7b8961
    https://github.com/scummvm/scummvm/commit/19647ff996187421a409698c03746db43b7b8961
Author: Krish (ganatrakrish2882005 at gmail.com)
Date: 2024-08-14T21:52:03+02:00

Commit Message:
VIDEO: Implement row and column navigation methods

Changed paths:
    video/qt_decoder.cpp
    video/qt_decoder.h


diff --git a/video/qt_decoder.cpp b/video/qt_decoder.cpp
index dea508c00f6..b2f9c959e39 100644
--- a/video/qt_decoder.cpp
+++ b/video/qt_decoder.cpp
@@ -671,6 +671,55 @@ void QuickTimeDecoder::handleMouseButton(bool isDown, int16 x, int16 y) {
 	}
 }
 
+void QuickTimeDecoder::setCurrentRow(int row) {
+	VideoTrackHandler *track = (VideoTrackHandler *)_nextVideoTrack;
+
+	int currentColumn = track->getCurFrame() % _nav.columns;
+	int newFrame = row * _nav.columns + currentColumn;
+
+	if (newFrame >= 0 && newFrame < track->getFrameCount()) {
+		track->setCurFrame(newFrame);
+	}
+}
+
+void QuickTimeDecoder::setCurrentColumn(int column) {
+	VideoTrackHandler *track = (VideoTrackHandler *)_nextVideoTrack;
+
+	int currentRow = track->getCurFrame() / _nav.columns;
+	int newFrame = currentRow * _nav.columns + column;
+
+	if (newFrame >= 0 && newFrame < track->getFrameCount()) {
+		track->setCurFrame(newFrame);
+	}
+}
+
+void QuickTimeDecoder::nudge(const Common::String &direction) {
+	VideoTrackHandler *track = (VideoTrackHandler *)_nextVideoTrack;
+
+	int curFrame = track->getCurFrame();
+	int currentRow = curFrame / _nav.columns;
+	int currentRowStart = currentRow * _nav.columns;
+	int newFrame = curFrame;
+
+	if (direction.equalsIgnoreCase("left")) {
+		newFrame = (curFrame - 1 - currentRowStart) % _nav.columns + currentRowStart;
+	} else if (direction.equalsIgnoreCase("right")) {
+		newFrame = (curFrame + 1 - currentRowStart) % _nav.columns + currentRowStart;
+	} else if (direction.equalsIgnoreCase("top")) {
+		newFrame = curFrame - _nav.columns;
+		if (newFrame < 0)
+			return;
+	} else if (direction.equalsIgnoreCase("bottom")) {
+		newFrame = curFrame + _nav.columns;
+		if (newFrame >= track->getFrameCount())
+			return;
+	} else {
+		error("QuickTimeDecoder::nudge(): Invald direction: ('%s')!", direction.c_str());
+	}
+
+	track->setCurFrame(newFrame);
+}
+
 QuickTimeDecoder::NodeData QuickTimeDecoder::getNodeData(uint32 nodeID) {
 	for (const auto &sample : _panoTrack->panoSamples) {
 		if (sample.hdr.nodeID == nodeID) {
diff --git a/video/qt_decoder.h b/video/qt_decoder.h
index a645cb4b76d..ac599a2e660 100644
--- a/video/qt_decoder.h
+++ b/video/qt_decoder.h
@@ -83,6 +83,13 @@ public:
 	float getFOV() const { return ((VideoTrackHandler *)_nextVideoTrack)->getFOV(); }
 	void setFOV(float fov) { ((VideoTrackHandler *)_nextVideoTrack)->setFOV(fov); }
 
+	int getCurrentRow() { return _nextVideoTrack->getCurFrame() / _nav.columns; }
+	void setCurrentRow(int row);
+	int getCurrentColumn() { return _nextVideoTrack->getCurFrame() % _nav.columns; }
+	void setCurrentColumn(int column);
+
+	void nudge(const Common::String &direction);
+
 	bool isVR() const { return _isVR; }
 	QTVRType getQTVRType() const { return _qtvrType; }
 


Commit: cd85cfb4dac6554eb79623f106f8979cf0b46599
    https://github.com/scummvm/scummvm/commit/cd85cfb4dac6554eb79623f106f8979cf0b46599
Author: Krish (ganatrakrish2882005 at gmail.com)
Date: 2024-08-14T21:52:03+02:00

Commit Message:
DIRECTOR: LINGO: XOBJ: Implement frame navigation methods and remove stubs

Changed paths:
    engines/director/lingo/xtras/qtvrxtra.cpp


diff --git a/engines/director/lingo/xtras/qtvrxtra.cpp b/engines/director/lingo/xtras/qtvrxtra.cpp
index 9f91236ecd5..2db311249b6 100644
--- a/engines/director/lingo/xtras/qtvrxtra.cpp
+++ b/engines/director/lingo/xtras/qtvrxtra.cpp
@@ -208,10 +208,10 @@ static MethodProto xlibMethods[] = {
 	{ "QTVRCollapseToHotSpotRgn",				QtvrxtraXtra::m_QTVRCollapseToHotSpotRgn,		 0, 0,	500 },
 	{ "QTVRZoomOutEffect",				QtvrxtraXtra::m_QTVRZoomOutEffect,		 3, 0,	500 },
 	{ "QTVRGetColumn",				QtvrxtraXtra::m_QTVRGetColumn,		 0, 0,	500 },
-	{ "QTVRSetColumn",				QtvrxtraXtra::m_QTVRSetColumn,		 1, 0,	500 },
+	{ "QTVRSetColumn",				QtvrxtraXtra::m_QTVRSetColumn,		 1, 1,	500 },
 	{ "QTVRGetRow",				QtvrxtraXtra::m_QTVRGetRow,		 0, 0,	500 },
-	{ "QTVRSetRow",				QtvrxtraXtra::m_QTVRSetRow,		 1, 0,	500 },
-	{ "QTVRNudge",				QtvrxtraXtra::m_QTVRNudge,		 1, 0,	500 },
+	{ "QTVRSetRow",				QtvrxtraXtra::m_QTVRSetRow,		 1, 1,	500 },
+	{ "QTVRNudge",				QtvrxtraXtra::m_QTVRNudge,		 1, 1,	500 },
 	{ "QTVRGetMouseDownHandler",				QtvrxtraXtra::m_QTVRGetMouseDownHandler,		 0, 0,	500 },
 	{ "QTVRSetMouseDownHandler",				QtvrxtraXtra::m_QTVRSetMouseDownHandler,		 1, 0,	500 },
 	{ "QTVRGetMouseOverHandler",				QtvrxtraXtra::m_QTVRGetMouseOverHandler,		 0, 0,	500 },
@@ -584,11 +584,60 @@ XOBJSTUB(QtvrxtraXtra::m_QTVRGetWarpMode, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRSetWarpMode, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRCollapseToHotSpotRgn, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRZoomOutEffect, 0)
-XOBJSTUB(QtvrxtraXtra::m_QTVRGetColumn, 0)
-XOBJSTUB(QtvrxtraXtra::m_QTVRSetColumn, 0)
-XOBJSTUB(QtvrxtraXtra::m_QTVRGetRow, 0)
-XOBJSTUB(QtvrxtraXtra::m_QTVRSetRow, 0)
-XOBJSTUB(QtvrxtraXtra::m_QTVRNudge, 0)
+
+void QtvrxtraXtra::m_QTVRGetColumn(int nargs) {
+	g_lingo->printArgs("QtvrxtraXtra::m_QTVRGetColumn", nargs);
+	ARGNUMCHECK(0);
+
+	QtvrxtraXtraObject *me = (QtvrxtraXtraObject *)g_lingo->_state->me.u.obj;
+
+	g_lingo->push(Common::String::format("%d", me->_video->getCurrentColumn()));
+}
+
+void QtvrxtraXtra::m_QTVRSetColumn(int nargs) {
+	g_lingo->printArgs("QtvrxtraXtra::m_QTVRSetColumn", nargs);
+	ARGNUMCHECK(1);
+
+	QtvrxtraXtraObject *me = (QtvrxtraXtraObject *)g_lingo->_state->me.u.obj;
+
+	me->_video->setCurrentColumn(atoi(g_lingo->pop().asString().c_str()));
+}
+
+void QtvrxtraXtra::m_QTVRGetRow(int nargs) {
+	g_lingo->printArgs("QtvrxtraXtra::m_QTVRGetRow", nargs);
+	ARGNUMCHECK(0);
+
+	QtvrxtraXtraObject *me = (QtvrxtraXtraObject *)g_lingo->_state->me.u.obj;
+
+	g_lingo->push(Common::String::format("%d", me->_video->getCurrentRow()));
+}
+
+void QtvrxtraXtra::m_QTVRSetRow(int nargs) {
+	g_lingo->printArgs("QtvrxtraXtra::m_QTVRSetRow", nargs);
+	ARGNUMCHECK(1);
+
+	QtvrxtraXtraObject *me = (QtvrxtraXtraObject *)g_lingo->_state->me.u.obj;
+
+	me->_video->setCurrentRow(atoi(g_lingo->pop().asString().c_str()));
+}
+
+void QtvrxtraXtra::m_QTVRNudge(int nargs) {
+	g_lingo->printArgs("QtvrxtraXtra::m_QTVRNudge", nargs);
+	ARGNUMCHECK(1);
+
+	QtvrxtraXtraObject *me = (QtvrxtraXtraObject *)g_lingo->_state->me.u.obj;
+
+	Common::String direction = g_lingo->pop().asString();
+
+	if (!(direction.equalsIgnoreCase("left") || direction.equalsIgnoreCase("right") ||
+		  direction.equalsIgnoreCase("top") || direction.equalsIgnoreCase("bottom"))) {
+		error("QtvrxtraXtra::m_QTVRNudge(): Invald direction: ('%s')!", direction.c_str());
+		return;
+	}
+
+	me->_video->nudge(direction);
+}
+
 XOBJSTUB(QtvrxtraXtra::m_QTVRGetMouseDownHandler, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRSetMouseDownHandler, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRGetMouseOverHandler, 0)


Commit: 4a5f4d250f73aa3dfafa22246b84747912aab7b9
    https://github.com/scummvm/scummvm/commit/4a5f4d250f73aa3dfafa22246b84747912aab7b9
Author: Krish (ganatrakrish2882005 at gmail.com)
Date: 2024-08-14T21:52:03+02:00

Commit Message:
DIRECTOR: LINGO: XOBJ: Implement MouseOver method and remove stub

Changed paths:
    engines/director/lingo/xtras/qtvrxtra.cpp
    engines/director/lingo/xtras/qtvrxtra.h


diff --git a/engines/director/lingo/xtras/qtvrxtra.cpp b/engines/director/lingo/xtras/qtvrxtra.cpp
index 2db311249b6..be976429945 100644
--- a/engines/director/lingo/xtras/qtvrxtra.cpp
+++ b/engines/director/lingo/xtras/qtvrxtra.cpp
@@ -388,7 +388,58 @@ void QtvrxtraXtra::m_QTVRGetQTVRType(int nargs) {
 
 XOBJSTUB(QtvrxtraXtra::m_QTVRIdle, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRMouseDown, 0)
-XOBJSTUB(QtvrxtraXtra::m_QTVRMouseOver, 0)
+
+bool QtvrxtraXtraObject::processEvent(Common::Event &event) {
+	// FIXME: This class needs to inherit from MacWidget and override this function
+
+	if (!_capEventsMouseOver)
+		return false;
+
+	switch (event.type) {
+	case Common::EVENT_LBUTTONDOWN:
+		_video->handleMouseButton(true, event.mouse.x, event.mouse.y);
+		return true;
+	case Common::EVENT_LBUTTONUP:
+		_video->handleMouseButton(false);
+		return true;
+	case Common::EVENT_MOUSEMOVE:
+		_video->handleMouseMove(event.mouse.x, event.mouse.y);
+		if (!_rect.contains(event.mouse))
+			_capEventsMouseOver = false;
+		return true;
+	case Common::EVENT_KEYDOWN:
+		switch (event.kbd.keycode) {
+		case Common::KEYCODE_LEFT:
+			_video->nudge("left");
+			break;
+		case Common::KEYCODE_RIGHT:
+			_video->nudge("right");
+			break;
+		case Common::KEYCODE_UP:
+			_video->nudge("top");
+			break;
+		case Common::KEYCODE_DOWN:
+			_video->nudge("bottom");
+			break;
+		default:
+			break;
+		}
+		return true;
+	default:
+		return false;
+	}
+}
+
+void QtvrxtraXtra::m_QTVRMouseOver(int nargs) {
+	g_lingo->printSTUBWithArglist("QtvrxtraXtra::m_QTVRMouseOver", nargs);
+	ARGNUMCHECK(0);
+
+	QtvrxtraXtraObject *me = (QtvrxtraXtraObject *)g_lingo->_state->me.u.obj;
+
+	me->_capEventsMouseOver = true;
+
+	g_lingo->push(Datum(0));
+}
 
 void QtvrxtraXtra::m_QTVRGetPanAngle(int nargs) {
 	g_lingo->printArgs("QtvrxtraXtra::m_QTVRGetPanAngle", nargs);
@@ -650,7 +701,16 @@ XOBJSTUB(QtvrxtraXtra::m_QTVRGetPanZoomStartHandler, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRSetPanZoomStartHandler, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRGetRolloverHotSpotHandler, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRSetRolloverHotSpotHandler, 0)
-XOBJSTUB(QtvrxtraXtra::m_QTVRExitMouseOver, 0)
+
+void QtvrxtraXtra::m_QTVRExitMouseOver(int nargs) {
+	g_lingo->printArgs("QtvrxtraXtra::m_QTVRExitMouseOver", nargs);
+	ARGNUMCHECK(0);
+
+	QtvrxtraXtraObject *me = (QtvrxtraXtraObject *)g_lingo->_state->me.u.obj;
+
+	me->_capEventsMouseOver = false;
+}
+
 XOBJSTUB(QtvrxtraXtra::m_QTVRPassMouseDown, 0)
 
 void QtvrxtraXtra::m_IsQTVRMovie(int nargs) {
diff --git a/engines/director/lingo/xtras/qtvrxtra.h b/engines/director/lingo/xtras/qtvrxtra.h
index ec02bcb8921..6bd35ace0e5 100644
--- a/engines/director/lingo/xtras/qtvrxtra.h
+++ b/engines/director/lingo/xtras/qtvrxtra.h
@@ -33,6 +33,8 @@ public:
 	bool hasProp(const Common::String &propName) override;
 	Datum getProp(const Common::String &propName) override;
 
+	bool processEvent(Common::Event &event);
+
 	Video::QuickTimeDecoder *_video;
 
 	Common::Rect _rect;
@@ -45,6 +47,8 @@ public:
 	float _transitionSpeed;
 
 	Common::String _updateMode;
+
+	bool _capEventsMouseOver;
 };
 
 namespace QtvrxtraXtra {


Commit: 9e800a6f2909321d588fa0024ca0a2a122c9fa93
    https://github.com/scummvm/scummvm/commit/9e800a6f2909321d588fa0024ca0a2a122c9fa93
Author: Krish (ganatrakrish2882005 at gmail.com)
Date: 2024-08-14T21:52:03+02:00

Commit Message:
DIRECTOR: LINGO: XOBJ: Implement MouseDown methods and remove stubs

Changed paths:
    engines/director/lingo/xtras/qtvrxtra.cpp
    engines/director/lingo/xtras/qtvrxtra.h


diff --git a/engines/director/lingo/xtras/qtvrxtra.cpp b/engines/director/lingo/xtras/qtvrxtra.cpp
index be976429945..3e444cbfd96 100644
--- a/engines/director/lingo/xtras/qtvrxtra.cpp
+++ b/engines/director/lingo/xtras/qtvrxtra.cpp
@@ -387,20 +387,32 @@ void QtvrxtraXtra::m_QTVRGetQTVRType(int nargs) {
 }
 
 XOBJSTUB(QtvrxtraXtra::m_QTVRIdle, 0)
-XOBJSTUB(QtvrxtraXtra::m_QTVRMouseDown, 0)
 
 bool QtvrxtraXtraObject::processEvent(Common::Event &event) {
 	// FIXME: This class needs to inherit from MacWidget and override this function
 
-	if (!_capEventsMouseOver)
+	if (!(_capEventsMouseOver && _capEventsMouseDown))
 		return false;
 
 	switch (event.type) {
 	case Common::EVENT_LBUTTONDOWN:
-		_video->handleMouseButton(true, event.mouse.x, event.mouse.y);
+		if (_mouseDownHandler.empty()) {
+			_video->handleMouseButton(true, event.mouse.x, event.mouse.y);
+		} else {
+			_passMouseDown = false;
+
+			g_lingo->executeHandler(_mouseDownHandler);
+
+			if (_passMouseDown) {
+				_video->handleMouseButton(true, event.mouse.x, event.mouse.y);
+				_passMouseDown = false;
+			}
+		}
 		return true;
 	case Common::EVENT_LBUTTONUP:
 		_video->handleMouseButton(false);
+		if (_capEventsMouseDown)
+			_capEventsMouseDown = false;
 		return true;
 	case Common::EVENT_MOUSEMOVE:
 		_video->handleMouseMove(event.mouse.x, event.mouse.y);
@@ -430,6 +442,17 @@ bool QtvrxtraXtraObject::processEvent(Common::Event &event) {
 	}
 }
 
+void QtvrxtraXtra::m_QTVRMouseDown(int nargs) {
+	g_lingo->printSTUBWithArglist("QtvrxtraXtra::m_QTVRMouseDown", nargs);
+	ARGNUMCHECK(0);
+
+	QtvrxtraXtraObject *me = (QtvrxtraXtraObject *)g_lingo->_state->me.u.obj;
+
+	me->_capEventsMouseDown = true;
+
+	g_lingo->push(Datum(0));
+}
+
 void QtvrxtraXtra::m_QTVRMouseOver(int nargs) {
 	g_lingo->printSTUBWithArglist("QtvrxtraXtra::m_QTVRMouseOver", nargs);
 	ARGNUMCHECK(0);
@@ -689,8 +712,24 @@ void QtvrxtraXtra::m_QTVRNudge(int nargs) {
 	me->_video->nudge(direction);
 }
 
-XOBJSTUB(QtvrxtraXtra::m_QTVRGetMouseDownHandler, 0)
-XOBJSTUB(QtvrxtraXtra::m_QTVRSetMouseDownHandler, 0)
+void QtvrxtraXtra::m_QTVRGetMouseDownHandler(int nargs) {
+	g_lingo->printArgs("QtvrxtraXtra::m_QTVRGetMouseDownHandler", nargs);
+	ARGNUMCHECK(0);
+
+	QtvrxtraXtraObject *me = (QtvrxtraXtraObject *)g_lingo->_state->me.u.obj;
+
+	g_lingo->push(me->_mouseDownHandler);
+}
+
+void QtvrxtraXtra::m_QTVRSetMouseDownHandler(int nargs) {
+	g_lingo->printArgs("QtvrxtraXtra::m_QTVRSetMouseDownHandler", nargs);
+	ARGNUMCHECK(1);
+
+	QtvrxtraXtraObject *me = (QtvrxtraXtraObject *)g_lingo->_state->me.u.obj;
+
+	me->_mouseDownHandler = g_lingo->pop().asString();
+}
+
 XOBJSTUB(QtvrxtraXtra::m_QTVRGetMouseOverHandler, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRSetMouseOverHandler, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRGetMouseStillDownHandler, 0)
@@ -711,7 +750,14 @@ void QtvrxtraXtra::m_QTVRExitMouseOver(int nargs) {
 	me->_capEventsMouseOver = false;
 }
 
-XOBJSTUB(QtvrxtraXtra::m_QTVRPassMouseDown, 0)
+void QtvrxtraXtra::m_QTVRPassMouseDown(int nargs) {
+	g_lingo->printArgs("QtvrxtraXtra::m_QTVRPassMouseDown", nargs);
+	ARGNUMCHECK(0);
+
+	QtvrxtraXtraObject *me = (QtvrxtraXtraObject *)g_lingo->_state->me.u.obj;
+
+	me->_passMouseDown = true;
+}
 
 void QtvrxtraXtra::m_IsQTVRMovie(int nargs) {
 	g_lingo->printArgs("QtvrxtraXtra::m_IsQTVRMovie", nargs);
diff --git a/engines/director/lingo/xtras/qtvrxtra.h b/engines/director/lingo/xtras/qtvrxtra.h
index 6bd35ace0e5..12ca2e930c2 100644
--- a/engines/director/lingo/xtras/qtvrxtra.h
+++ b/engines/director/lingo/xtras/qtvrxtra.h
@@ -49,6 +49,11 @@ public:
 	Common::String _updateMode;
 
 	bool _capEventsMouseOver;
+	bool _capEventsMouseDown;
+
+	bool _passMouseDown;
+
+	Common::String _mouseDownHandler;
 };
 
 namespace QtvrxtraXtra {


Commit: d237519c1de40a8032f85c9783ebc6b026f64d5a
    https://github.com/scummvm/scummvm/commit/d237519c1de40a8032f85c9783ebc6b026f64d5a
Author: Krish (ganatrakrish2882005 at gmail.com)
Date: 2024-08-14T21:52:03+02:00

Commit Message:
DIRECTOR: LINGO: XOBJ: Implement new/forget and remove stubs

Changed paths:
    engines/director/lingo/xtras/qtvrxtra.cpp


diff --git a/engines/director/lingo/xtras/qtvrxtra.cpp b/engines/director/lingo/xtras/qtvrxtra.cpp
index 3e444cbfd96..3ea76faad9b 100644
--- a/engines/director/lingo/xtras/qtvrxtra.cpp
+++ b/engines/director/lingo/xtras/qtvrxtra.cpp
@@ -275,12 +275,23 @@ void QtvrxtraXtra::close(ObjectType type) {
 }
 
 void QtvrxtraXtra::m_new(int nargs) {
-	g_lingo->printSTUBWithArglist("QtvrxtraXtra::m_new", nargs);
-	g_lingo->dropStack(nargs);
+	g_lingo->printArgs("QtvrxtraXtra::m_new", nargs);
+	ARGNUMCHECK(0);
+
 	g_lingo->push(g_lingo->_state->me);
 }
 
-XOBJSTUB(QtvrxtraXtra::m_forget, 0)
+void QtvrxtraXtra::m_forget(int nargs) {
+	g_lingo->printArgs("QtvrxtraXtra::m_forget", nargs);
+	ARGNUMCHECK(0);
+
+	QtvrxtraXtraObject *me = (QtvrxtraXtraObject *)g_lingo->_state->me.u.obj;
+
+	if (me->_video) {
+		me->_video->close();
+		delete me->_video;
+	}
+}
 
 void QtvrxtraXtra::m_QTVREnter(int nargs) {
 	g_lingo->printArgs("QtvrxtraXtra::m_QTVREnter", nargs);


Commit: a1d70a25fd2d095a0ec2d6f3c29cfa60c34fa5a7
    https://github.com/scummvm/scummvm/commit/a1d70a25fd2d095a0ec2d6f3c29cfa60c34fa5a7
Author: Krish (ganatrakrish2882005 at gmail.com)
Date: 2024-08-14T21:52:03+02:00

Commit Message:
VIDEO: Implement QTVRGet/SetWarpMode methods

Changed paths:
    video/qt_decoder.h


diff --git a/video/qt_decoder.h b/video/qt_decoder.h
index ac599a2e660..91d8bd41ea2 100644
--- a/video/qt_decoder.h
+++ b/video/qt_decoder.h
@@ -93,6 +93,9 @@ public:
 	bool isVR() const { return _isVR; }
 	QTVRType getQTVRType() const { return _qtvrType; }
 
+	uint8 getWarpMode() const { return _warpMode; }
+	void setWarpMode(uint8 warpMode) { _warpMode = warpMode; }
+
 	struct NodeData {
 		uint32 nodeID;
 
@@ -126,6 +129,8 @@ private:
 
 	bool _isVR;
 
+	uint8 _warpMode; // (2 | 1 | 0) for 2-d, 1-d or no warping
+
 	Graphics::Surface *_scaledSurface;
 	void scaleSurface(const Graphics::Surface *src, Graphics::Surface *dst,
 			const Common::Rational &scaleFactorX, const Common::Rational &scaleFactorY);


Commit: 6acd9a26593efb522485a3fbb1199622c931741e
    https://github.com/scummvm/scummvm/commit/6acd9a26593efb522485a3fbb1199622c931741e
Author: Krish (ganatrakrish2882005 at gmail.com)
Date: 2024-08-14T21:52:03+02:00

Commit Message:
DIRECTOR: LINGO: XOBJ: Implement QTVRGet/SetWarpMode and remove stubs

Changed paths:
    engines/director/lingo/xtras/qtvrxtra.cpp


diff --git a/engines/director/lingo/xtras/qtvrxtra.cpp b/engines/director/lingo/xtras/qtvrxtra.cpp
index 3ea76faad9b..05372a07b21 100644
--- a/engines/director/lingo/xtras/qtvrxtra.cpp
+++ b/engines/director/lingo/xtras/qtvrxtra.cpp
@@ -665,8 +665,24 @@ void QtvrxtraXtra::m_QTVRSetVisible(int nargs) {
 	me->_visible = (bool)g_lingo->pop().asInt();
 }
 
-XOBJSTUB(QtvrxtraXtra::m_QTVRGetWarpMode, 0)
-XOBJSTUB(QtvrxtraXtra::m_QTVRSetWarpMode, 0)
+void QtvrxtraXtra::m_QTVRGetWarpMode(int nargs) {
+	g_lingo->printArgs("QtvrxtraXtra::m_QTVRGetWarpMode", nargs);
+	ARGNUMCHECK(0);
+
+	QtvrxtraXtraObject *me = (QtvrxtraXtraObject *)g_lingo->_state->me.u.obj;
+
+	g_lingo->push(me->_video->getWarpMode());
+}
+
+void QtvrxtraXtra::m_QTVRSetWarpMode(int nargs) {
+	g_lingo->printArgs("QtvrxtraXtra::m_QTVRSetWarpMode", nargs);
+	ARGNUMCHECK(1);
+
+	QtvrxtraXtraObject *me = (QtvrxtraXtraObject *)g_lingo->_state->me.u.obj;
+
+	me->_video->setWarpMode(g_lingo->pop().asInt());
+}
+
 XOBJSTUB(QtvrxtraXtra::m_QTVRCollapseToHotSpotRgn, 0)
 XOBJSTUB(QtvrxtraXtra::m_QTVRZoomOutEffect, 0)
 


Commit: ab0bb7345601851c170cab3184b4fc135f28db6b
    https://github.com/scummvm/scummvm/commit/ab0bb7345601851c170cab3184b4fc135f28db6b
Author: Krish (ganatrakrish2882005 at gmail.com)
Date: 2024-08-14T21:52:03+02:00

Commit Message:
DIRECTOR: LINGO: Map 'the member of sprite'

Changed paths:
    engines/director/lingo/lingo-builtins.cpp
    engines/director/lingo/lingo-bytecode.cpp
    engines/director/lingo/lingo-the.cpp
    engines/director/lingo/lingo-the.h


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 0c7b0aaa437..2de6cd99813 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -3360,7 +3360,9 @@ void LB::b_member(int nargs) {
 	CastMemberID res;
 	if (nargs == 1) {
 		Datum member = g_lingo->pop();
-		if (member.isNumeric()) {
+		if (member.isCastRef()) {
+			res = member.asMemberID();
+		} else if (member.isNumeric()) {
 			res = movie->getCastMemberIDByMember(member.asInt());
 		} else {
 			res = movie->getCastMemberIDByName(member.asString());
@@ -3374,7 +3376,9 @@ void LB::b_member(int nargs) {
 		} else {
 			libId = movie->getCastLibIDByName(library.asString());
 		}
-		if (member.isNumeric()) {
+		if (member.isCastRef()) {
+			res = member.asMemberID();
+		} else if (member.isNumeric()) {
 			res = CastMemberID(member.asInt(), libId);
 		} else {
 			res = movie->getCastMemberIDByNameAndType(member.asString(), libId, kCastTypeAny);
diff --git a/engines/director/lingo/lingo-bytecode.cpp b/engines/director/lingo/lingo-bytecode.cpp
index 603459a85e0..247b4654274 100644
--- a/engines/director/lingo/lingo-bytecode.cpp
+++ b/engines/director/lingo/lingo-bytecode.cpp
@@ -212,6 +212,7 @@ static LingoV4TheEntity lingoV4TheEntity[] = {
 	{ 0x06, 0x21, kTheSprite,			kTheLoc,			true, kTEAItemId },
 	{ 0x06, 0x22, kTheSprite,			kTheRect,			true, kTEAItemId },
 	{ 0x06, 0x23, kTheSprite,			kTheMemberNum,		true, kTEAItemId }, // D5
+	{ 0x06, 0x25, kTheSprite,			kTheMember,			true, kTEAItemId },
 
 	{ 0x07, 0x01, kTheBeepOn,			kTheNOField,		true, kTEANOArgs },
 	{ 0x07, 0x02, kTheButtonStyle,		kTheNOField,		true, kTEANOArgs },
diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp
index 135eb3c34a3..395efd85442 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -1327,6 +1327,9 @@ Datum Lingo::getTheSprite(Datum &id1, int field) {
 	case kTheBottom:
 		d = channel->getBbox().bottom;
 		break;
+	case kTheMember:
+		d = sprite->_castId;
+		break;
 	case kTheCastNum:
 	case kTheMemberNum:
 		d = sprite->_castId.member;
@@ -1496,6 +1499,20 @@ void Lingo::setTheSprite(Datum &id1, int field, Datum &d) {
 			sprite->setAutoPuppet(kAPBlend, true);
 		}
 		break;
+	case kTheMember:
+		{
+			CastMemberID targetMember = d.asMemberID();
+
+			if (targetMember != sprite->_castId) {
+				movie->getWindow()->addDirtyRect(channel->getBbox());
+				movie->duplicateCastMember(targetMember, sprite->_castId);
+				channel->_sprite->setCast(sprite->_castId);
+				// Ensure the new sprite, whether larger or smaller, appears correctly on the screen
+				movie->getWindow()->addDirtyRect(channel->getBbox());
+				channel->_dirty = true;
+			}
+		}
+		break;
 	case kTheCastNum:
 	case kTheMemberNum:
 		{
diff --git a/engines/director/lingo/lingo-the.h b/engines/director/lingo/lingo-the.h
index 62764afd0b0..db63c3c9fc7 100644
--- a/engines/director/lingo/lingo-the.h
+++ b/engines/director/lingo/lingo-the.h
@@ -189,6 +189,7 @@ enum TheFieldType {
 	kTheLocV,
 	kTheLong,
 	kTheLoop,
+	kTheMember,
 	kTheMemberNum,
 	kTheModal,
 	kTheModified,


Commit: a32db29b1bdade1766d6f6470ef8fbacda4389c7
    https://github.com/scummvm/scummvm/commit/a32db29b1bdade1766d6f6470ef8fbacda4389c7
Author: Krish (ganatrakrish2882005 at gmail.com)
Date: 2024-08-14T21:52:03+02:00

Commit Message:
DIRECTOR: LINGO: Map 'scrollTop' entity field

Changed paths:
    engines/director/lingo/lingo-the.cpp
    engines/director/lingo/lingo-the.h


diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp
index 395efd85442..1bfbe6c9a64 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -249,6 +249,8 @@ TheEntityField fields[] = {
 	{ kTheCast,		"textHeight",	kTheTextHeight,	300 },//		D3 p
 	{ kTheCast,		"textSize",		kTheTextSize,	300 },//		D3 p
 	{ kTheCast,		"textStyle",	kTheTextStyle,	300 },//		D3 p
+	{ kTheCast,		"scrollTop",	kTheScrollTop,  300 },//						D5 p
+
 
 	// Field fields
 	{ kTheField,	"foreColor",	kTheForeColor,	400 },//				D4 p
@@ -260,6 +262,7 @@ TheEntityField fields[] = {
 	{ kTheField,	"textHeight",	kTheTextHeight,	300 },//		D3 p
 	{ kTheField,	"textSize",		kTheTextSize,	300 },//		D3 p
 	{ kTheField,	"textStyle",	kTheTextStyle,	300 },//		D3 p
+	{ kTheField,	"scrollTop",	kTheScrollTop,  300 },//						D5 p
 
 	// Chunk fields
 	{ kTheChunk,	"foreColor",	kTheForeColor,	400 },//				D4 p
diff --git a/engines/director/lingo/lingo-the.h b/engines/director/lingo/lingo-the.h
index db63c3c9fc7..0d23e358033 100644
--- a/engines/director/lingo/lingo-the.h
+++ b/engines/director/lingo/lingo-the.h
@@ -237,6 +237,7 @@ enum TheFieldType {
 	kTheVolume,
 	kTheWidth,
 	kTheWindowType,
+	kTheScrollTop,
 	kTheMaxTheFieldType		// This must be always last
 };
 


Commit: 9b20d74486f3b188ef24d7d0555246568be06b64
    https://github.com/scummvm/scummvm/commit/9b20d74486f3b188ef24d7d0555246568be06b64
Author: Krish (ganatrakrish2882005 at gmail.com)
Date: 2024-08-14T21:52:03+02:00

Commit Message:
DIRECTOR: Extend getField to retrieve scrollTop

Changed paths:
    engines/director/castmember/text.cpp


diff --git a/engines/director/castmember/text.cpp b/engines/director/castmember/text.cpp
index c76501f7ba5..87b042e524e 100644
--- a/engines/director/castmember/text.cpp
+++ b/engines/director/castmember/text.cpp
@@ -502,6 +502,7 @@ bool TextCastMember::hasField(int field) {
 	case kTheTextHeight:
 	case kTheTextSize:
 	case kTheTextStyle:
+	case kTheScrollTop:
 		return true;
 	default:
 		break;
@@ -549,6 +550,9 @@ Datum TextCastMember::getField(int field) {
 	case kTheTextStyle:
 		d = (int)_textSlant;
 		break;
+	case kTheScrollTop:
+		d = _scroll;
+		break;
 	default:
 		d = CastMember::getField(field);
 	}
@@ -652,6 +656,9 @@ bool TextCastMember::setField(int field, const Datum &d) {
 		_ptext = ((Graphics::MacText *)toEdit->_widget)->getPlainText();
 		_ftext = ((Graphics::MacText *)toEdit->_widget)->getTextChunk(0, 0, -1, -1, true);
 		return true;
+	case kTheScrollTop:
+		_scroll = d.asInt();
+		return true;
 	default:
 		break;
 	}




More information about the Scummvm-git-logs mailing list