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

aquadran noreply at scummvm.org
Wed Aug 5 11:55:41 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:
f3cebb3386 WINTERMUTE: Added D3D effect shader support for 'Miskatonic - Part One: The Inhuman Stain'


Commit: f3cebb3386405b5cc8865d65648228dcd0f22ce3
    https://github.com/scummvm/scummvm/commit/f3cebb3386405b5cc8865d65648228dcd0f22ce3
Author: Paweł Kołodziejski (aquadran at gmail.com)
Date: 2026-08-05T13:55:27+02:00

Commit Message:
WINTERMUTE: Added D3D effect shader support for 'Miskatonic - Part One: The Inhuman Stain'

Changed paths:
    engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
    engines/wintermute/base/gfx/opengl/meshx_opengl_shader.cpp
    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 9e347ef4d7c..b6601b1b385 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
@@ -374,6 +374,9 @@ bool BaseRenderOpenGL3DShader::setup3D(Camera3D *camera, bool force) {
 	_shadowVolumeShader->setUniform("viewMatrix", viewMatrix);
 	_shadowVolumeShader->setUniform("projMatrix", projectionMatrix);
 
+	projectionMatrix.setData(_projectionMatrix);
+	_xmodelShader->setUniform("d3dProjMatrix", projectionMatrix);
+
 	return true;
 }
 
diff --git a/engines/wintermute/base/gfx/opengl/meshx_opengl_shader.cpp b/engines/wintermute/base/gfx/opengl/meshx_opengl_shader.cpp
index 13c7972f63f..2393edb3a2a 100644
--- a/engines/wintermute/base/gfx/opengl/meshx_opengl_shader.cpp
+++ b/engines/wintermute/base/gfx/opengl/meshx_opengl_shader.cpp
@@ -153,6 +153,12 @@ bool XMeshOpenGLShader::render(XModel *model) {
 		_shader->setUniform("ambient", diffuse);
 		_shader->setUniform("effectId", 0);
 
+		Math::Vector4d shadowLightPos;
+		shadowLightPos.x() = model->_shadowLightPos._x;
+		shadowLightPos.y() = model->_shadowLightPos._y;
+		shadowLightPos.z() = model->_shadowLightPos._z;
+		shadowLightPos.w() = 0.0f;
+		_shader->setUniform("shadowLightPos", shadowLightPos);
 		setupEffect(mat, false);
 		size_t offsetFace = 4 * attrs[i]._faceStart * 3;
 		glDrawElements(GL_TRIANGLES, attrs[i]._faceCount * 3, GL_UNSIGNED_INT, (void *)offsetFace);
@@ -324,6 +330,11 @@ bool XMeshOpenGLShader::setupEffect(Material *material, bool secondPassNeeded) {
 		}
 		return true;
 	}
+	case 0x2AD31E3B: // "effects\\outer_glow.fx"
+	{
+		_shader->setUniform("effectId", 2);
+		return false;
+	}
 	default:
 		warning("Unknown effect hash: %x", effectId);
 		return false;
diff --git a/engines/wintermute/base/gfx/opengl/shaders/wme_modelx.fragment b/engines/wintermute/base/gfx/opengl/shaders/wme_modelx.fragment
index 3250a2ef177..422e5364868 100644
--- a/engines/wintermute/base/gfx/opengl/shaders/wme_modelx.fragment
+++ b/engines/wintermute/base/gfx/opengl/shaders/wme_modelx.fragment
@@ -36,5 +36,7 @@ void main() {
 		} else {
 			outColor = Color;
 		}
+	} else if (effectId == 2) {
+		outColor = texture(tex, Texcoord) * max(vec4(0.4), Color);
 	}
 }
diff --git a/engines/wintermute/base/gfx/opengl/shaders/wme_modelx.vertex b/engines/wintermute/base/gfx/opengl/shaders/wme_modelx.vertex
index 96df1acdda2..18fff5b4c38 100644
--- a/engines/wintermute/base/gfx/opengl/shaders/wme_modelx.vertex
+++ b/engines/wintermute/base/gfx/opengl/shaders/wme_modelx.vertex
@@ -6,10 +6,12 @@ uniform highp mat4 modelMatrix;
 uniform highp mat4 viewMatrix;
 uniform highp mat4 projMatrix;
 uniform highp mat4 normalMatrix;
+uniform highp mat4 d3dProjMatrix;
 
 uniform vec4 ambientLight;
 uniform vec4 diffuse;
 uniform vec4 ambient;
+uniform vec4 shadowLightPos;
 
 uniform int effectId;
 uniform UBOOL effectSecondPass;
@@ -93,5 +95,14 @@ void main() {
 		}
 
 		gl_Position = pos;
+	} else if (effectId == 2) {
+		Texcoord = texcoord;
+
+		vec4 viewCoords = viewMatrix * modelMatrix * vec4(position, 1.0);
+		gl_Position = projMatrix * viewCoords;
+
+		vec4 lightDir = vec4((viewMatrix * shadowLightPos).xyz, 0.0) - d3dProjMatrix * viewCoords;
+		lightDir /= length(lightDir);
+		Color = vec4(dot(normal, lightDir.xyz));
 	}
 }




More information about the Scummvm-git-logs mailing list