[Scummvm-git-logs] scummvm master -> 2d017a7efc23f5891e0a1e42b20696460124518d
aquadran
noreply at scummvm.org
Sat Jul 16 08:44:28 UTC 2022
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:
2d017a7efc WINTERMUTE: WME3D: Implement screenshots in 3d renderers
Commit: 2d017a7efc23f5891e0a1e42b20696460124518d
https://github.com/scummvm/scummvm/commit/2d017a7efc23f5891e0a1e42b20696460124518d
Author: PaweÅ KoÅodziejski (aquadran at gmail.com)
Date: 2022-07-16T10:44:24+02:00
Commit Message:
WINTERMUTE: WME3D: Implement screenshots in 3d renderers
Changed paths:
engines/wintermute/base/gfx/base_renderer3d.cpp
engines/wintermute/base/gfx/base_renderer3d.h
engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
engines/wintermute/base/gfx/opengl/base_render_opengl3d.h
engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h
engines/wintermute/base/save_thumb_helper.cpp
diff --git a/engines/wintermute/base/gfx/base_renderer3d.cpp b/engines/wintermute/base/gfx/base_renderer3d.cpp
index b6ce3f2d267..4db83387e3a 100644
--- a/engines/wintermute/base/gfx/base_renderer3d.cpp
+++ b/engines/wintermute/base/gfx/base_renderer3d.cpp
@@ -120,4 +120,15 @@ Math::Matrix3 BaseRenderer3D::build2dTransformation(const Vector2 ¢er, float
return translateCenterBack * rotation * translateCenter;
}
+void BaseRenderer3D::flipVertical(Graphics::Surface *s) {
+ for (int y = 0; y < s->h / 2; ++y) {
+ // Flip the lines
+ byte *line1P = (byte *)s->getBasePtr(0, y);
+ byte *line2P = (byte *)s->getBasePtr(0, s->h - y - 1);
+
+ for (int x = 0; x < s->pitch; ++x)
+ SWAP(line1P[x], line2P[x]);
+ }
+}
+
} // namespace Wintermute
diff --git a/engines/wintermute/base/gfx/base_renderer3d.h b/engines/wintermute/base/gfx/base_renderer3d.h
index 43c9ddfc0ea..c3defd93ff1 100644
--- a/engines/wintermute/base/gfx/base_renderer3d.h
+++ b/engines/wintermute/base/gfx/base_renderer3d.h
@@ -29,6 +29,7 @@
#include "engines/wintermute/math/vector2.h"
#include "graphics/transform_struct.h"
+#include "graphics/surface.h"
#include "math/matrix4.h"
#include "math/ray.h"
@@ -114,6 +115,8 @@ protected:
Math::Matrix4 _lastViewMatrix;
Math::Matrix4 _projectionMatrix3d;
Rect32 _viewport3dRect;
+
+ void flipVertical(Graphics::Surface *s);
};
} // namespace Wintermute
diff --git a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
index fe2ea4c010f..9377d23f1f5 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
@@ -23,6 +23,7 @@
#include "engines/wintermute/ad/ad_generic.h"
#include "engines/wintermute/ad/ad_walkplane.h"
#include "engines/wintermute/base/base_game.h"
+#include "engines/wintermute/base/gfx/base_image.h"
#include "engines/wintermute/base/gfx/3ds/camera3d.h"
#include "engines/wintermute/base/gfx/3ds/light3d.h"
@@ -221,13 +222,23 @@ bool BaseRenderOpenGL3D::stencilSupported() {
}
BaseImage *BaseRenderOpenGL3D::takeScreenshot() {
- warning("BaseRenderOpenGL3D::takeScreenshot not yet implemented");
- return nullptr;
-}
-
-bool BaseRenderOpenGL3D::saveScreenShot(const Common::String &filename, int sizeX, int sizeY) {
- warning("BaseRenderOpenGL3D::saveScreenshot not yet implemented");
- return true;
+ BaseImage *screenshot = new BaseImage();
+ Graphics::Surface *surface = new Graphics::Surface();
+#ifdef SCUMM_BIG_ENDIAN
+ Graphics::PixelFormat format(4, 8, 8, 8, 8, 24, 16, 8, 0);
+#else
+ Graphics::PixelFormat format(4, 8, 8, 8, 8, 0, 8, 16, 24);
+#endif
+ surface->create(_viewportRect.width(), _viewportRect.height(), format);
+
+ glReadPixels(_viewportRect.left, g_system->getHeight() - _viewportRect.bottom, _viewportRect.width(), _viewportRect.height(),
+ GL_RGBA, GL_UNSIGNED_BYTE, surface->getPixels());
+ flipVertical(surface);
+ Graphics::Surface *converted = surface->convertTo(Graphics::PixelFormat(4, 8, 8, 8, 8, 24, 16, 8, 0));
+ screenshot->copyFrom(converted);
+ delete surface;
+ delete converted;
+ return screenshot;
}
void BaseRenderOpenGL3D::setWindowed(bool windowed) {
diff --git a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.h b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.h
index b3fa2f1c44c..16f2cddd2a0 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.h
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.h
@@ -75,7 +75,6 @@ public:
void dumpData(const char *filename) override {}
BaseImage *takeScreenshot() override;
- bool saveScreenShot(const Common::String &filename, int sizeX = 0, int sizeY = 0) override;
void setWindowed(bool windowed) override;
void fadeToColor(byte r, byte g, byte b, byte a) override;
diff --git a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
index 0760d6ac7ad..a6ae8fd4d90 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
@@ -23,6 +23,7 @@
#include "engines/wintermute/ad/ad_generic.h"
#include "engines/wintermute/ad/ad_walkplane.h"
#include "engines/wintermute/base/base_game.h"
+#include "engines/wintermute/base/gfx/base_image.h"
#include "engines/wintermute/base/gfx/3ds/camera3d.h"
#include "graphics/opengl/system_headers.h"
@@ -335,13 +336,23 @@ bool BaseRenderOpenGL3DShader::stencilSupported() {
}
BaseImage *BaseRenderOpenGL3DShader::takeScreenshot() {
- warning("BaseRenderOpenGL3DShader::takeScreenshot not yet implemented");
- return nullptr;
-}
-
-bool BaseRenderOpenGL3DShader::saveScreenShot(const Common::String &filename, int sizeX, int sizeY) {
- warning("BaseRenderOpenGL3DShader::saveScreenshot not yet implemented");
- return true;
+ BaseImage *screenshot = new BaseImage();
+ Graphics::Surface *surface = new Graphics::Surface();
+#ifdef SCUMM_BIG_ENDIAN
+ Graphics::PixelFormat format(4, 8, 8, 8, 8, 24, 16, 8, 0);
+#else
+ Graphics::PixelFormat format(4, 8, 8, 8, 8, 0, 8, 16, 24);
+#endif
+ surface->create(_viewportRect.width(), _viewportRect.height(), format);
+
+ glReadPixels(_viewportRect.left, g_system->getHeight() - _viewportRect.bottom, _viewportRect.width(), _viewportRect.height(),
+ GL_RGBA, GL_UNSIGNED_BYTE, surface->getPixels());
+ flipVertical(surface);
+ Graphics::Surface *converted = surface->convertTo(Graphics::PixelFormat(4, 8, 8, 8, 8, 24, 16, 8, 0));
+ screenshot->copyFrom(converted);
+ delete surface;
+ delete converted;
+ return screenshot;
}
void BaseRenderOpenGL3DShader::setWindowed(bool windowed) {
diff --git a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h
index a15dd69e9c6..597d0381f73 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h
@@ -65,7 +65,6 @@ public:
void dumpData(const char *filename) override {}
BaseImage *takeScreenshot() override;
- bool saveScreenShot(const Common::String &filename, int sizeX = 0, int sizeY = 0) override;
void setWindowed(bool windowed) override;
void fadeToColor(byte r, byte g, byte b, byte a) override;
bool fill(byte r, byte g, byte b, Common::Rect *rect = nullptr) override;
diff --git a/engines/wintermute/base/save_thumb_helper.cpp b/engines/wintermute/base/save_thumb_helper.cpp
index 56de37ff71d..3c77b8faab7 100644
--- a/engines/wintermute/base/save_thumb_helper.cpp
+++ b/engines/wintermute/base/save_thumb_helper.cpp
@@ -50,7 +50,7 @@ SaveThumbHelper::~SaveThumbHelper(void) {
BaseImage *SaveThumbHelper::storeThumb(bool doFlip, int width, int height) {
BaseImage *thumbnail = nullptr;
if (_gameRef->getSaveThumbWidth() > 0 && _gameRef->getSaveThumbHeight() > 0) {
- if (doFlip) {
+ if (doFlip && !_gameRef->_useD3D) {
// when using opengl on windows it seems to be necessary to do this twice
// works normally for direct3d
_gameRef->displayContent(false);
More information about the Scummvm-git-logs
mailing list