[Scummvm-git-logs] scummvm master -> d7de6eb0572f79fe5a2f17a453b43c6456fdd17c

sev- noreply at scummvm.org
Thu Feb 6 19:11:55 UTC 2025


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

Summary:
c4ac202659 VIDEO: QTVR: Initial code for proper panorama projection
55ab930434 VIDEO: QTVR: More work on cylindrical panorama projection
e9eec042cc VIDEO: QTVR: Converted angle calculations to radian
d7de6eb057 VIDEO: QTVR: Cleanup the commented out code


Commit: c4ac20265985ebdded37fdfa1ebc7403a520e831
    https://github.com/scummvm/scummvm/commit/c4ac20265985ebdded37fdfa1ebc7403a520e831
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-02-06T16:48:14+01:00

Commit Message:
VIDEO: QTVR: Initial code for proper panorama projection

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


diff --git a/video/qt_decoder.cpp b/video/qt_decoder.cpp
index fdc3ced1291..79d2052f5c3 100644
--- a/video/qt_decoder.cpp
+++ b/video/qt_decoder.cpp
@@ -95,14 +95,6 @@ void QuickTimeDecoder::close() {
 	closeQTVR();
 }
 
-void QuickTimeDecoder::setTargetSize(uint16 w, uint16 h) {
-	if (!isVR())
-		error("QuickTimeDecoder::setTargetSize() called on non-VR movie");
-
-	_width = w;
-	_height = h;
-}
-
 const Graphics::Surface *QuickTimeDecoder::decodeNextFrame() {
 	const Graphics::Surface *frame = VideoDecoder::decodeNextFrame();
 
diff --git a/video/qt_decoder.h b/video/qt_decoder.h
index 8c8df16100b..393ffc22914 100644
--- a/video/qt_decoder.h
+++ b/video/qt_decoder.h
@@ -85,7 +85,7 @@ public:
 	float getTiltAngle() const { return _tiltAngle; }
 	void setTiltAngle(float tiltAngle) { _tiltAngle = tiltAngle; }
 	float getFOV() const { return _fov; }
-	void setFOV(float fov) { _fov = fov; }
+	void setFOV(float fov);
 
 	int getCurrentRow() { return _nextVideoTrack->getCurFrame() / _nav.columns; }
 	void setCurrentRow(int row);
@@ -155,7 +155,8 @@ private:
 
 	float _panAngle = 0.0f;
 	float _tiltAngle = 0.0f;
-	float _fov = 0.0f;
+	float _fov = 56.0f;
+	float _hfov = 56.0f;
 
 	Graphics::Surface *_scaledSurface;
 	void scaleSurface(const Graphics::Surface *src, Graphics::Surface *dst,
@@ -347,6 +348,7 @@ private:
 
 		float _curPanAngle;
 		float _curTiltAngle;
+
 		bool _dirty;
 	};
 };
diff --git a/video/qtvr_decoder.cpp b/video/qtvr_decoder.cpp
index 45227e999bf..3c904b0ab91 100644
--- a/video/qtvr_decoder.cpp
+++ b/video/qtvr_decoder.cpp
@@ -120,6 +120,22 @@ void QuickTimeDecoder::closeQTVR() {
 	cleanupCursors();
 }
 
+void QuickTimeDecoder::setTargetSize(uint16 w, uint16 h) {
+	if (!isVR())
+		error("QuickTimeDecoder::setTargetSize() called on non-VR movie");
+
+	_width = w;
+	_height = h;
+
+	setFOV(_fov);
+}
+
+void QuickTimeDecoder::setFOV(float fov) {
+	_fov = fov;
+
+	_hfov = _fov * (float)_width / (float)_height;
+}
+
 void QuickTimeDecoder::updateAngles() {
 	_panAngle = (float)getCurrentColumn() / (float)_nav.columns * 360.0;
 	_tiltAngle = ((_nav.rows - 1) / 2.0 - (float)getCurrentRow()) / (float)(_nav.rows - 1) * 180.0;
@@ -481,6 +497,7 @@ void QuickTimeDecoder::PanoTrackHandler::projectPanorama() {
 		_projectedPano->create(w, h, _constructedPano->format);
 	}
 
+#if 1
 	PanoSampleDesc *desc = (PanoSampleDesc *)_parent->sampleDescs[0];
 	int startY = (((float)desc->_sceneSizeY - w) / (desc->_hPanEnd - desc->_hPanStart)) * (_curPanAngle - desc->_hPanStart);
 	int startX = ((float)(desc->_sceneSizeX - h) / (desc->_vPanTop - desc->_vPanBottom)) * (_curTiltAngle - desc->_vPanBottom);
@@ -496,7 +513,27 @@ void QuickTimeDecoder::PanoTrackHandler::projectPanorama() {
 	}
 
 	_dirty = false;
+#else
+	PanoSampleDesc *desc = (PanoSampleDesc *)_parent->sampleDescs[0];
+
+	for (uint16 y = 0; y < h; y++) {
+		for (uint16 x = 0; x < w; x++) {
+			float panAngle = _curPanAngle + (x - w / 2) * _decoder->_hfov / (float)w;
+			float tiltAngle = _curTiltAngle + (y - h / 2) * _decoder->_fov / (float)h;
+			float vprecalc = (sin(tiltAngle) + 1.0) / 2.0;
+
+			// It is flipped 90 degrees
+			int u = (((float)desc->_sceneSizeY - w) / (desc->_hPanEnd - desc->_hPanStart)) * (panAngle - desc->_hPanStart);
+			int v = desc->_sceneSizeX * vprecalc;
+
+			warning("u: %d of %d, v: %d of %d", u, _constructedPano->w, v, _constructedPano->h);
+
+			uint32 pixel = _constructedPano->getPixel(v, u);
+			_projectedPano->setPixel(x, y, pixel);
+		}
+	}
 
+#endif
 
 #if 0
 	const float c = _projectedPano->w;
@@ -521,16 +558,18 @@ void QuickTimeDecoder::PanoTrackHandler::projectPanorama() {
 	}
 
 #endif
+
+	_dirty = false;
 }
 
 void QuickTimeDecoder::PanoTrackHandler::setPanAngle(float angle) {
 	PanoSampleDesc *desc = (PanoSampleDesc *)_parent->sampleDescs[0];
 
-	if (angle < desc->_hPanStart)
-		angle = desc->_hPanStart;
+	if (angle < desc->_hPanStart + _decoder->_hfov / 2)
+		angle = desc->_hPanStart + _decoder->_hfov / 2;
 
-	if (angle > desc->_hPanEnd)
-		angle = desc->_hPanEnd;
+	if (angle > desc->_hPanEnd - _decoder->_hfov / 2)
+		angle = desc->_hPanEnd - _decoder->_hfov / 2;
 
 	if (_curPanAngle != angle) {
 		_curPanAngle = angle;
@@ -542,11 +581,11 @@ void QuickTimeDecoder::PanoTrackHandler::setPanAngle(float angle) {
 void QuickTimeDecoder::PanoTrackHandler::setTiltAngle(float angle) {
 	PanoSampleDesc *desc = (PanoSampleDesc *)_parent->sampleDescs[0];
 
-	if (angle < desc->_vPanBottom)
-		angle = desc->_vPanBottom;
+	if (angle < desc->_vPanBottom + _decoder->_fov / 2)
+		angle = desc->_vPanBottom + _decoder->_fov / 2;
 
-	if (angle > desc->_vPanTop)
-		angle = desc->_vPanTop;
+	if (angle > desc->_vPanTop - _decoder->_fov / 2)
+		angle = desc->_vPanTop - _decoder->_fov / 2;
 
 	if (_curTiltAngle != angle) {
 		_curTiltAngle = angle;


Commit: 55ab930434c739a364cdf3950071c61f9f627e4b
    https://github.com/scummvm/scummvm/commit/55ab930434c739a364cdf3950071c61f9f627e4b
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-02-06T18:38:34+01:00

Commit Message:
VIDEO: QTVR: More work on cylindrical panorama projection

Changed paths:
    video/qtvr_decoder.cpp


diff --git a/video/qtvr_decoder.cpp b/video/qtvr_decoder.cpp
index 3c904b0ab91..b56fee95157 100644
--- a/video/qtvr_decoder.cpp
+++ b/video/qtvr_decoder.cpp
@@ -497,7 +497,7 @@ void QuickTimeDecoder::PanoTrackHandler::projectPanorama() {
 		_projectedPano->create(w, h, _constructedPano->format);
 	}
 
-#if 1
+#if 0
 	PanoSampleDesc *desc = (PanoSampleDesc *)_parent->sampleDescs[0];
 	int startY = (((float)desc->_sceneSizeY - w) / (desc->_hPanEnd - desc->_hPanStart)) * (_curPanAngle - desc->_hPanStart);
 	int startX = ((float)(desc->_sceneSizeX - h) / (desc->_vPanTop - desc->_vPanBottom)) * (_curTiltAngle - desc->_vPanBottom);
@@ -516,17 +516,34 @@ void QuickTimeDecoder::PanoTrackHandler::projectPanorama() {
 #else
 	PanoSampleDesc *desc = (PanoSampleDesc *)_parent->sampleDescs[0];
 
+	warning("pan: %f  tilt: %f", _curPanAngle, _curTiltAngle);
+
 	for (uint16 y = 0; y < h; y++) {
 		for (uint16 x = 0; x < w; x++) {
-			float panAngle = _curPanAngle + (x - w / 2) * _decoder->_hfov / (float)w;
-			float tiltAngle = _curTiltAngle + (y - h / 2) * _decoder->_fov / (float)h;
-			float vprecalc = (sin(tiltAngle) + 1.0) / 2.0;
+			float panAngle = _curPanAngle + (x - w / 2) * _decoder->_hfov / (float)w - desc->_hPanStart;
+
+			if (panAngle < 0.0f)
+				panAngle += 360.0f;
 
 			// It is flipped 90 degrees
-			int u = (((float)desc->_sceneSizeY - w) / (desc->_hPanEnd - desc->_hPanStart)) * (panAngle - desc->_hPanStart);
+			int u = ((float)desc->_sceneSizeY) / (desc->_hPanEnd - desc->_hPanStart) * panAngle;
+
+
+			float tiltAngle = _curTiltAngle + (y - h / 2) * _decoder->_fov / (float)h;
+			float vprecalc = tan(tiltAngle * M_PI / 180.0);
+
+			if (vprecalc > 1.0)
+				vprecalc = 0;
+			if (vprecalc < -1.0)
+				vprecalc = -1.00;
+
+			vprecalc = (vprecalc + 1.0f) / 2.0f;
+
 			int v = desc->_sceneSizeX * vprecalc;
 
-			warning("u: %d of %d, v: %d of %d", u, _constructedPano->w, v, _constructedPano->h);
+
+			if ((x == 0 && y == 0) || (x == w - 1 && y == h - 1))
+				warning("%f -> %d, %f -> %d  pan: %f  tilt: %f,  vprec: %f", panAngle, u, tiltAngle, v, panAngle, tiltAngle, vprecalc);
 
 			uint32 pixel = _constructedPano->getPixel(v, u);
 			_projectedPano->setPixel(x, y, pixel);
@@ -574,6 +591,8 @@ void QuickTimeDecoder::PanoTrackHandler::setPanAngle(float angle) {
 	if (_curPanAngle != angle) {
 		_curPanAngle = angle;
 
+		_decoder->setPanAngle(_curPanAngle);
+
 		_dirty = true;
 	}
 }
@@ -590,6 +609,8 @@ void QuickTimeDecoder::PanoTrackHandler::setTiltAngle(float angle) {
 	if (_curTiltAngle != angle) {
 		_curTiltAngle = angle;
 
+		_decoder->setTiltAngle(_curTiltAngle);
+
 		_dirty = true;
 	}
 }


Commit: e9eec042ccc0495215aee16d47cdc497f6d4e62b
    https://github.com/scummvm/scummvm/commit/e9eec042ccc0495215aee16d47cdc497f6d4e62b
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-02-06T19:11:27+01:00

Commit Message:
VIDEO: QTVR: Converted angle calculations to radian

Changed paths:
    video/qtvr_decoder.cpp


diff --git a/video/qtvr_decoder.cpp b/video/qtvr_decoder.cpp
index b56fee95157..9b920ffe596 100644
--- a/video/qtvr_decoder.cpp
+++ b/video/qtvr_decoder.cpp
@@ -525,25 +525,23 @@ void QuickTimeDecoder::PanoTrackHandler::projectPanorama() {
 			if (panAngle < 0.0f)
 				panAngle += 360.0f;
 
+			panAngle = panAngle * M_PI / 180.0;
+
 			// It is flipped 90 degrees
-			int u = ((float)desc->_sceneSizeY) / (desc->_hPanEnd - desc->_hPanStart) * panAngle;
+			int u = ((float)desc->_sceneSizeY) / (desc->_hPanEnd - desc->_hPanStart) / M_PI * 180.0 * panAngle;
 
 
 			float tiltAngle = _curTiltAngle + (y - h / 2) * _decoder->_fov / (float)h;
-			float vprecalc = tan(tiltAngle * M_PI / 180.0);
-
-			if (vprecalc > 1.0)
-				vprecalc = 0;
-			if (vprecalc < -1.0)
-				vprecalc = -1.00;
-
-			vprecalc = (vprecalc + 1.0f) / 2.0f;
+			tiltAngle = tan(tiltAngle * M_PI / 180.0);
 
-			int v = desc->_sceneSizeX * vprecalc;
+			if (tiltAngle > 1.0)
+				tiltAngle = 1.0;
+			if (tiltAngle < -1.0)
+				tiltAngle = -1.00;
 
+			tiltAngle = (tiltAngle + 1.0f) / 2.0f;
 
-			if ((x == 0 && y == 0) || (x == w - 1 && y == h - 1))
-				warning("%f -> %d, %f -> %d  pan: %f  tilt: %f,  vprec: %f", panAngle, u, tiltAngle, v, panAngle, tiltAngle, vprecalc);
+			int v = desc->_sceneSizeX * tiltAngle;
 
 			uint32 pixel = _constructedPano->getPixel(v, u);
 			_projectedPano->setPixel(x, y, pixel);


Commit: d7de6eb0572f79fe5a2f17a453b43c6456fdd17c
    https://github.com/scummvm/scummvm/commit/d7de6eb0572f79fe5a2f17a453b43c6456fdd17c
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2025-02-06T20:11:32+01:00

Commit Message:
VIDEO: QTVR: Cleanup the commented out code

Changed paths:
    video/qtvr_decoder.cpp


diff --git a/video/qtvr_decoder.cpp b/video/qtvr_decoder.cpp
index 9b920ffe596..4c92064b2a3 100644
--- a/video/qtvr_decoder.cpp
+++ b/video/qtvr_decoder.cpp
@@ -497,26 +497,7 @@ void QuickTimeDecoder::PanoTrackHandler::projectPanorama() {
 		_projectedPano->create(w, h, _constructedPano->format);
 	}
 
-#if 0
 	PanoSampleDesc *desc = (PanoSampleDesc *)_parent->sampleDescs[0];
-	int startY = (((float)desc->_sceneSizeY - w) / (desc->_hPanEnd - desc->_hPanStart)) * (_curPanAngle - desc->_hPanStart);
-	int startX = ((float)(desc->_sceneSizeX - h) / (desc->_vPanTop - desc->_vPanBottom)) * (_curTiltAngle - desc->_vPanBottom);
-
-	for (uint16 y = 0; y < h; y++) {
-		for (uint16 x = 0; x < w; x++) {
-			int setX = y + startX;
-			int setY = x + startY;
-
-			uint32 pixel = _constructedPano->getPixel(setX, setY);
-			_projectedPano->setPixel(x, y, pixel);
-		}
-	}
-
-	_dirty = false;
-#else
-	PanoSampleDesc *desc = (PanoSampleDesc *)_parent->sampleDescs[0];
-
-	warning("pan: %f  tilt: %f", _curPanAngle, _curTiltAngle);
 
 	for (uint16 y = 0; y < h; y++) {
 		for (uint16 x = 0; x < w; x++) {
@@ -530,7 +511,6 @@ void QuickTimeDecoder::PanoTrackHandler::projectPanorama() {
 			// It is flipped 90 degrees
 			int u = ((float)desc->_sceneSizeY) / (desc->_hPanEnd - desc->_hPanStart) / M_PI * 180.0 * panAngle;
 
-
 			float tiltAngle = _curTiltAngle + (y - h / 2) * _decoder->_fov / (float)h;
 			tiltAngle = tan(tiltAngle * M_PI / 180.0);
 
@@ -548,32 +528,6 @@ void QuickTimeDecoder::PanoTrackHandler::projectPanorama() {
 		}
 	}
 
-#endif
-
-#if 0
-	const float c = _projectedPano->w;
-	const float r = c / (2 * M_PI);
-
-	// HACK: FIXME: Hard coded for now
-	const float d = 500.0f;
-
-	for (int16 y = 0; y < _projectedPano->h; y++) {
-		for (int16 x = 0; x < _projectedPano->w; x++) {
-			double u = atan(x / d) / (2.0 * M_PI);
-			double v = y * r * cos(u) / d;
-
-			int setX = round(u * _constructedPano->w);
-			int setY = round(v);
-
-			if (setX >= 0 && setX < _constructedPano->w && setY >= 0 && setY < _constructedPano->h) {
-				uint32 pixel = _constructedPano->getPixel(setX, setY);
-				_projectedPano->setPixel(x, y, pixel);
-			}
-		}
-	}
-
-#endif
-
 	_dirty = false;
 }
 




More information about the Scummvm-git-logs mailing list