[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