[Scummvm-git-logs] scummvm master -> 4ad957333a33e5ace6e8a824bc270e8cce761a3a

aquadran noreply at scummvm.org
Fri May 23 09:17:38 UTC 2025


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:
4ad957333a WINTERMUTE: Implemented fog support for shader renderer


Commit: 4ad957333a33e5ace6e8a824bc270e8cce761a3a
    https://github.com/scummvm/scummvm/commit/4ad957333a33e5ace6e8a824bc270e8cce761a3a
Author: Paweł Kołodziejski (aquadran at gmail.com)
Date: 2025-05-23T11:17:33+02:00

Commit Message:
WINTERMUTE: Implemented fog support for shader renderer

Changed paths:
    engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
    engines/wintermute/base/gfx/opengl/shaders/wme_flat_shadow_modelx.fragment
    engines/wintermute/base/gfx/opengl/shaders/wme_modelx.fragment
    engines/wintermute/base/gfx/opengl/shaders/wme_modelx.vertex


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 df6b562cc84..371190e05ef 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
@@ -278,14 +278,17 @@ bool BaseRenderOpenGL3DShader::setup3D(Camera3D *camera, bool force) {
 
 		_gameRef->getFogParams(&fogEnabled, &fogColor, &fogStart, &fogEnd);
 		if (fogEnabled) {
-			// TODO: Implement fog
-			GLfloat color[4] = { RGBCOLGetR(fogColor) / 255.0f,
-			                     RGBCOLGetG(fogColor) / 255.0f,
-			                     RGBCOLGetB(fogColor) / 255.0f,
-			                     RGBCOLGetA(fogColor) / 255.0f };
-			debug(5, "BaseRenderOpenGL3DShader::setup3D fog not yet implemented! [%f %f %f %f]", color[0], color[1], color[2], color[3]);
+			Math::Vector4d color;
+			color.x() = RGBCOLGetR(fogColor) / 255.0f;
+			color.y() = RGBCOLGetG(fogColor) / 255.0f;
+			color.z() = RGBCOLGetB(fogColor) / 255.0f;
+			color.w() = RGBCOLGetA(fogColor) / 255.0f;
+			_xmodelShader->setUniform("enableFog", true);
+			_xmodelShader->setUniform("fogColor", color);
+			_xmodelShader->setUniform1f("fogStart", fogStart);
+			_xmodelShader->setUniform1f("fogEnd", fogEnd);
 		} else {
-			// TODO: Disable fog in shader
+			_xmodelShader->setUniform("enableFog", false);
 		}
 
 		setProjection();
diff --git a/engines/wintermute/base/gfx/opengl/shaders/wme_flat_shadow_modelx.fragment b/engines/wintermute/base/gfx/opengl/shaders/wme_flat_shadow_modelx.fragment
index 0296908835f..46d6aa9a300 100644
--- a/engines/wintermute/base/gfx/opengl/shaders/wme_flat_shadow_modelx.fragment
+++ b/engines/wintermute/base/gfx/opengl/shaders/wme_flat_shadow_modelx.fragment
@@ -1,5 +1,4 @@
 uniform vec4 shadowColor;
-uniform float alphaRef;
 
 OUTPUT
 
diff --git a/engines/wintermute/base/gfx/opengl/shaders/wme_modelx.fragment b/engines/wintermute/base/gfx/opengl/shaders/wme_modelx.fragment
index 1952c7bd500..9fde1f0b73b 100644
--- a/engines/wintermute/base/gfx/opengl/shaders/wme_modelx.fragment
+++ b/engines/wintermute/base/gfx/opengl/shaders/wme_modelx.fragment
@@ -5,15 +5,22 @@ uniform sampler2D tex;
 uniform float alphaRef;
 uniform UBOOL alphaTest;
 uniform UBOOL useTexture;
+uniform UBOOL enableFog;
+uniform vec4 fogColor;
+
+varying float fogFactor;
 
 OUTPUT
 
 void main() {
+	outColor = Color;
+
 	if (useTexture) {
-		vec4 texColor = texture(tex, Texcoord);
-		outColor.rgba = texColor.rgba * Color.rgba;
-	} else {
-		outColor.rgba = Color.rgba;
+		outColor = texture(tex, Texcoord) * outColor;
+	}
+
+	if (enableFog) {
+		outColor = mix(fogColor, outColor, fogFactor);
 	}
 
 	if (UBOOL_TEST(alphaTest) && outColor.a < alphaRef) {
diff --git a/engines/wintermute/base/gfx/opengl/shaders/wme_modelx.vertex b/engines/wintermute/base/gfx/opengl/shaders/wme_modelx.vertex
index 0e9a37ab539..b3f88d386ec 100644
--- a/engines/wintermute/base/gfx/opengl/shaders/wme_modelx.vertex
+++ b/engines/wintermute/base/gfx/opengl/shaders/wme_modelx.vertex
@@ -8,10 +8,13 @@ uniform highp mat4 projMatrix;
 uniform highp mat4 normalMatrix;
 
 uniform vec4 ambientLight;
-
 uniform vec4 diffuse;
 uniform vec4 ambient;
 
+uniform float fogStart;
+uniform float fogEnd;
+varying float fogFactor;
+
 struct Light {
 	vec4 _position;
 	vec4 _direction;
@@ -36,6 +39,9 @@ void main() {
 	vec3 light = vec3(0.0, 0.0, 0.0);
 	vec3 normalEye = normalize((normalMatrix * vec4(normal, 0.0)).xyz);
 
+	float fogCoord = abs(viewCoords.z);
+	fogFactor = clamp((fogEnd - fogCoord) / (fogEnd - fogStart), 0.0, 1.0);
+
 	for (int i = 0; i < maxLights; ++i) {
 		if (lights[i].enabled < 0.0) {
 			continue;




More information about the Scummvm-git-logs mailing list