[Scummvm-git-logs] scummvm master -> 9223de088f7338ee659ad613eff48ac4b25875c1

aquadran noreply at scummvm.org
Sat Jul 18 07:04:35 UTC 2026


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

Summary:
9223de088f WINTERMUTE: Added gamma support (only 3d renderer) for game 'Oknytt'


Commit: 9223de088f7338ee659ad613eff48ac4b25875c1
    https://github.com/scummvm/scummvm/commit/9223de088f7338ee659ad613eff48ac4b25875c1
Author: Paweł Kołodziejski (aquadran at gmail.com)
Date: 2026-07-18T09:04:21+02:00

Commit Message:
WINTERMUTE: Added gamma support (only 3d renderer) for game 'Oknytt'

Changed paths:
  A engines/wintermute/base/gfx/opengl/shaders/wme_gamma.fragment
  A engines/wintermute/base/gfx/opengl/shaders/wme_gamma.vertex
    dists/scummvm.rc
    engines/wintermute/base/base_game.cpp
    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_shader.cpp
    engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h


diff --git a/dists/scummvm.rc b/dists/scummvm.rc
index 4860fa4d26a..5dc58c37415 100644
--- a/dists/scummvm.rc
+++ b/dists/scummvm.rc
@@ -104,6 +104,8 @@ shaders/wme_fade.fragment               FILE    "engines/wintermute/base/gfx/ope
 shaders/wme_fade.vertex                 FILE    "engines/wintermute/base/gfx/opengl/shaders/wme_fade.vertex"
 shaders/wme_flat_shadow_modelx.fragment FILE    "engines/wintermute/base/gfx/opengl/shaders/wme_flat_shadow_modelx.fragment"
 shaders/wme_flat_shadow_modelx.vertex   FILE    "engines/wintermute/base/gfx/opengl/shaders/wme_flat_shadow_modelx.vertex"
+shaders/wme_gamma.fragment              FILE    "engines/wintermute/base/gfx/opengl/shaders/wme_gamma.fragment"
+shaders/wme_gamma.vertex                FILE    "engines/wintermute/base/gfx/opengl/shaders/wme_gamma.vertex"
 shaders/wme_geometry.fragment           FILE    "engines/wintermute/base/gfx/opengl/shaders/wme_geometry.fragment"
 shaders/wme_geometry.vertex             FILE    "engines/wintermute/base/gfx/opengl/shaders/wme_geometry.vertex"
 shaders/wme_line.fragment               FILE    "engines/wintermute/base/gfx/opengl/shaders/wme_line.fragment"
diff --git a/engines/wintermute/base/base_game.cpp b/engines/wintermute/base/base_game.cpp
index 5cebef9c8d6..bae8868883d 100644
--- a/engines/wintermute/base/base_game.cpp
+++ b/engines/wintermute/base/base_game.cpp
@@ -2849,6 +2849,37 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack
 
 		stack->pushNULL();
 
+		return STATUS_OK;
+	}
+	//////////////////////////////////////////////////////////////////////////
+	// SetGamma
+	// This is for game 'Oknytt'
+	//////////////////////////////////////////////////////////////////////////
+	else if (strcmp(name, "SetGamma") == 0) {
+		stack->correctParams(1);
+
+		int32 gamma = stack->pop()->getInt(0);
+
+		if (_renderer3D)
+			_renderer3D->setGamma(gamma);
+
+		stack->pushNULL();
+
+		return STATUS_OK;
+	}
+	//////////////////////////////////////////////////////////////////////////
+	// GetGamma
+	// This is for game 'Oknytt'
+	//////////////////////////////////////////////////////////////////////////
+	else if (strcmp(name, "GetGamma") == 0) {
+		stack->correctParams(0);
+
+		int32 gamma = 0;
+		if (_renderer3D)
+			gamma = _renderer3D->getGamma();
+
+		stack->pushInt(gamma);
+
 		return STATUS_OK;
 	} else {
 		return BaseObject::scCallMethod(script, stack, thisStack, name);
diff --git a/engines/wintermute/base/gfx/base_renderer3d.cpp b/engines/wintermute/base/gfx/base_renderer3d.cpp
index 78eb9d57eef..14b3d2b878e 100644
--- a/engines/wintermute/base/gfx/base_renderer3d.cpp
+++ b/engines/wintermute/base/gfx/base_renderer3d.cpp
@@ -44,6 +44,8 @@ BaseRenderer3D::BaseRenderer3D(Wintermute::BaseGame *inGame) : BaseRenderer(inGa
 	DXMatrixIdentity(&_worldMatrix);
 	DXMatrixIdentity(&_viewMatrix);
 	DXMatrixIdentity(&_projectionMatrix);
+
+	_gamma = -1;
 }
 
 BaseRenderer3D::~BaseRenderer3D() {
diff --git a/engines/wintermute/base/gfx/base_renderer3d.h b/engines/wintermute/base/gfx/base_renderer3d.h
index c0fcadaf84b..0074116a2ef 100644
--- a/engines/wintermute/base/gfx/base_renderer3d.h
+++ b/engines/wintermute/base/gfx/base_renderer3d.h
@@ -155,6 +155,13 @@ public:
 
 	void endSaveLoad() override;
 
+	void setGamma(int32 gamma) {
+		_gamma = gamma;
+	}
+	float getGamma() {
+		return _gamma;
+	}
+
 	// ScummVM specific methods <--
 
 protected:
@@ -168,6 +175,7 @@ protected:
 	TRendererState _state;
 	PostFilter _postFilterMode;
 	bool _flipInProgress;
+	int32 _gamma;
 
 	virtual void setAmbientLightRenderState() = 0;
 };
diff --git a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
index ad13a733e94..c19510f4033 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
@@ -27,6 +27,7 @@
 #include "engines/wintermute/ad/ad_walkplane.h"
 #include "engines/wintermute/ad/ad_waypoint_group3d.h"
 #include "engines/wintermute/base/base_game.h"
+#include "engines/wintermute/base/base_engine.h"
 #include "engines/wintermute/base/gfx/base_image.h"
 #include "engines/wintermute/base/gfx/3dcamera.h"
 #include "engines/wintermute/base/gfx/3dlight.h"
@@ -1042,6 +1043,77 @@ bool BaseRenderOpenGL3D::setProjectionTransform(const DXMatrix &transform) {
 }
 
 void BaseRenderOpenGL3D::postfilter() {
+	GLfloat vertices[] = {
+		-1.0f, -1.0f,
+		1.0f, -1.0f,
+		1.0f,  1.0f,
+		-1.0f,  1.0f
+	};
+
+	GLfloat texCoords[] = {
+		0.0f, 0.0f,
+		1.0f, 0.0f,
+		1.0f, 1.0f,
+		0.0f, 1.0f
+	};
+
+	// This is for game 'Oknytt'
+	if (_gamma != -1) {
+		setup2D();
+		glViewport(0, 0, _width, _height);
+
+		glMatrixMode(GL_PROJECTION);
+		glLoadIdentity();
+
+		glMatrixMode(GL_TEXTURE);
+		glLoadIdentity();
+
+		glMatrixMode(GL_MODELVIEW);
+		glLoadIdentity();
+
+		glDisable(GL_BLEND);
+		glDisable(GL_ALPHA_TEST);
+		glDisable(GL_CULL_FACE);
+
+		glEnable(GL_TEXTURE_2D);
+		glBindTexture(GL_TEXTURE_2D, _postfilterTexture);
+
+		g_system->presentBuffer();
+		glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, _width, _height, 0);
+
+		glEnableClientState(GL_VERTEX_ARRAY);
+		glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+		glVertexPointer(2, GL_FLOAT, 0, vertices);
+		glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
+
+		if (_gamma <= 140) {
+			float factor = 1.0f - (140.0f - _gamma) / 50.0f;
+			glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+			glColor4f(factor, factor, factor, 1.0f);
+			glDrawArrays(GL_QUADS, 0, 4);
+		} else {
+			glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+			glDrawArrays(GL_QUADS, 0, 4);
+			float alpha = (_gamma - 140.0f) / 200.0f;
+			glDisable(GL_TEXTURE_2D);
+			glEnable(GL_BLEND);
+			glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+			glColor4f(1.0f, 1.0f, 1.0f, alpha);
+			glDrawArrays(GL_QUADS, 0, 4);
+			glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+			glDisable(GL_BLEND);
+		}
+
+		glDisableClientState(GL_VERTEX_ARRAY);
+		glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+
+		glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+		glBindTexture(GL_TEXTURE_2D, 0);
+		glDisable(GL_TEXTURE_2D);
+
+		return;
+	}
+
 	if (_postFilterMode == kPostFilterOff)
 		return;
 
@@ -1057,20 +1129,6 @@ void BaseRenderOpenGL3D::postfilter() {
 	glMatrixMode(GL_MODELVIEW);
 	glLoadIdentity();
 
-	GLfloat vertices[] = {
-		-1.0f, -1.0f,
-		 1.0f, -1.0f,
-		 1.0f,  1.0f,
-		-1.0f,  1.0f
-	};
-
-	GLfloat texCoords[] = {
-		0.0f, 0.0f,
-		1.0f, 0.0f,
-		1.0f, 1.0f,
-		0.0f, 1.0f
-	};
-
 	if (_postFilterMode == kPostFilterBlackAndWhite ||
 		_postFilterMode == kPostFilterSepia) {
 		glDisable(GL_BLEND);
@@ -1123,7 +1181,7 @@ void BaseRenderOpenGL3D::postfilter() {
 
 		g_system->presentBuffer();
 		glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, _width, _height, 0);
-		
+
 		glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
 		glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
 		GLfloat luminanceWeights[] = { 0.65f, 0.65f, 0.65f };
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 f29df597494..dab71774ea6 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
@@ -63,6 +63,7 @@ BaseRenderOpenGL3DShader::~BaseRenderOpenGL3DShader() {
 	glDeleteBuffers(1, &_rectangleVBO);
 	glDeleteBuffers(1, &_simpleShadowVBO);
 	glDeleteBuffers(1, &_postfilterVBO);
+	glDeleteBuffers(1, &_gammaVBO);
 }
 
 bool BaseRenderOpenGL3DShader::initRenderer(int width, int height, bool windowed) {
@@ -184,6 +185,16 @@ bool BaseRenderOpenGL3DShader::initRenderer(int width, int height, bool windowed
 	_postfilterShader->enableVertexAttribute("position", _postfilterVBO, 2, GL_FLOAT, false, 4 * sizeof(GLfloat), 0);
 	_postfilterShader->enableVertexAttribute("texcoord", _postfilterVBO, 2, GL_FLOAT, false, 4 * sizeof(GLfloat), 8);
 
+	glGenBuffers(1, &_gammaVBO);
+	glBindBuffer(GL_ARRAY_BUFFER, _gammaVBO);
+	glBufferData(GL_ARRAY_BUFFER, 16 * sizeof(GLfloat), quadVertices, GL_STATIC_DRAW);
+	glBindBuffer(GL_ARRAY_BUFFER, 0);
+
+	static const char *gammaAttributes[] = { "position", "texcoord", nullptr };
+	_gammaShader = OpenGL::Shader::fromFiles("wme_gamma", gammaAttributes);
+	_gammaShader->enableVertexAttribute("position", _gammaVBO, 2, GL_FLOAT, false, 4 * sizeof(GLfloat), 0);
+	_gammaShader->enableVertexAttribute("texcoord", _gammaVBO, 2, GL_FLOAT, false, 4 * sizeof(GLfloat), 8);
+
 	glGenTextures(1, &_postfilterTexture);
 	glBindTexture(GL_TEXTURE_2D, _postfilterTexture);
 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
@@ -1151,6 +1162,30 @@ bool BaseRenderOpenGL3DShader::setProjectionTransform(const DXMatrix &transform)
 }
 
 void BaseRenderOpenGL3DShader::postfilter() {
+	// This is for game 'Oknytt'
+	if (_gamma != -1) {
+		setup2D();
+		glViewport(0, 0, _width, _height);
+		glDisable(GL_BLEND);
+		glDisable(GL_CULL_FACE);
+
+		_gammaShader->use();
+
+		glActiveTexture(GL_TEXTURE0);
+		glBindTexture(GL_TEXTURE_2D, _postfilterTexture);
+		glUniform1i(_gammaShader->getUniformLocation("tex"), 0);
+		_gammaShader->setUniform1f("gammaValue", _gamma);
+
+		g_system->presentBuffer();
+		glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, _width, _height, 0);
+
+		glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+
+		glBindTexture(GL_TEXTURE_2D, 0);
+
+		return;
+	}
+
 	if (_postFilterMode == kPostFilterOff)
 		return;
 
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 4aa7632121c..043bddfd256 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h
@@ -181,6 +181,7 @@ private:
 	GLuint _rectangleVBO{};
 	GLuint _simpleShadowVBO{};
 	GLuint _postfilterVBO{};
+	GLuint _gammaVBO{};
 	OpenGL::Shader *_spriteShader{};
 	OpenGL::Shader *_fadeShader{};
 	OpenGL::Shader *_xmodelShader{};
@@ -190,6 +191,7 @@ private:
 	OpenGL::Shader *_shadowVolumeShader{};
 	OpenGL::Shader *_lineShader{};
 	OpenGL::Shader *_postfilterShader{};
+	OpenGL::Shader *_gammaShader{};
 	GLuint _postfilterTexture;
 };
 
diff --git a/engines/wintermute/base/gfx/opengl/shaders/wme_gamma.fragment b/engines/wintermute/base/gfx/opengl/shaders/wme_gamma.fragment
new file mode 100644
index 00000000000..554754e8a4a
--- /dev/null
+++ b/engines/wintermute/base/gfx/opengl/shaders/wme_gamma.fragment
@@ -0,0 +1,13 @@
+varying vec2 texPos;
+
+uniform sampler2D tex;
+uniform float gammaValue;
+
+OUTPUT
+
+void main() {
+	vec4 color = texture2D(tex, texPos);
+	float t = (gammaValue - 140.0) / 15.0;
+	float gamma = exp2(t * 0.5);
+	outColor = vec4(pow(color.rgb, vec3(1.0 / gamma)), 1.0);
+}
diff --git a/engines/wintermute/base/gfx/opengl/shaders/wme_gamma.vertex b/engines/wintermute/base/gfx/opengl/shaders/wme_gamma.vertex
new file mode 100644
index 00000000000..0ab72b31e36
--- /dev/null
+++ b/engines/wintermute/base/gfx/opengl/shaders/wme_gamma.vertex
@@ -0,0 +1,9 @@
+in vec2 position;
+in vec2 texcoord;
+
+varying vec2 texPos;
+
+void main() {
+	gl_Position = vec4(position, 0.0, 1.0);
+	texPos = texcoord;
+}




More information about the Scummvm-git-logs mailing list