[Scummvm-git-logs] scummvm master -> 83ebe6e1d11c9a989d7393ded7dd21892f614563

aquadran noreply at scummvm.org
Tue May 20 08:58:59 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:
83ebe6e1d1 WINTERMUTE: Corrected texture mesh rendering for shader renderer


Commit: 83ebe6e1d11c9a989d7393ded7dd21892f614563
    https://github.com/scummvm/scummvm/commit/83ebe6e1d11c9a989d7393ded7dd21892f614563
Author: Paweł Kołodziejski (aquadran at gmail.com)
Date: 2025-05-20T10:58:52+02:00

Commit Message:
WINTERMUTE: Corrected texture mesh rendering for shader renderer

Changed paths:
    engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
    engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
    engines/wintermute/base/gfx/opengl/mesh3ds_opengl_shader.cpp
    engines/wintermute/base/gfx/opengl/meshx_opengl.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_sprite.vertex


diff --git a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
index c13b3f5af7d..e7cadeca17c 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
@@ -285,8 +285,8 @@ bool BaseRenderOpenGL3D::setupLines() {
 		glEnable(GL_ALPHA_TEST);
 		glLightModelfv(GL_LIGHT_MODEL_AMBIENT, value);
 
-		glDisable(GL_TEXTURE_2D);
 		glBindTexture(GL_TEXTURE_2D, 0);
+		glDisable(GL_TEXTURE_2D);
 		_lastTexture = nullptr;
 	}
 
@@ -792,8 +792,8 @@ void BaseRenderOpenGL3D::renderSceneGeometry(const BaseArray<AdWalkplane *> &pla
 	glFrontFace(GL_CW); // WME DX have CCW
 	glEnable(GL_BLEND);
 	glDisable(GL_ALPHA_TEST);
-	glDisable(GL_TEXTURE_2D);
 	glBindTexture(GL_TEXTURE_2D, 0);
+	glDisable(GL_TEXTURE_2D);
 
 	glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
 	glEnable(GL_COLOR_MATERIAL);
@@ -872,8 +872,8 @@ void BaseRenderOpenGL3D::renderShadowGeometry(const BaseArray<AdWalkplane *> &pl
 
 	// no texture
 	_lastTexture = nullptr;
-	glDisable(GL_TEXTURE_2D);
 	glBindTexture(GL_TEXTURE_2D, 0);
+	glDisable(GL_TEXTURE_2D);
 
 	glFrontFace(GL_CW); // WME DX have CCW
 
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 740c157a2c0..b33bd142c3f 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
@@ -300,8 +300,8 @@ bool BaseRenderOpenGL3DShader::setupLines() {
 		_lineShader->setUniform1f("alphaRef", _alphaRef);
 		_lineShader->setUniform("alphaTest", true);
 
-		glDisable(GL_TEXTURE_2D);
 		glBindTexture(GL_TEXTURE_2D, 0);
+		glDisable(GL_TEXTURE_2D);
 		_lastTexture = nullptr;
 	}
 
@@ -780,8 +780,8 @@ void BaseRenderOpenGL3DShader::renderShadowGeometry(const BaseArray<AdWalkplane
 
 	// no texture
 	_lastTexture = nullptr;
-	glDisable(GL_TEXTURE_2D);
 	glBindTexture(GL_TEXTURE_2D, 0);
+	glDisable(GL_TEXTURE_2D);
 
 	glFrontFace(GL_CW); // WME DX have CCW
 
diff --git a/engines/wintermute/base/gfx/opengl/mesh3ds_opengl_shader.cpp b/engines/wintermute/base/gfx/opengl/mesh3ds_opengl_shader.cpp
index b315d60a7fc..dd58112d873 100644
--- a/engines/wintermute/base/gfx/opengl/mesh3ds_opengl_shader.cpp
+++ b/engines/wintermute/base/gfx/opengl/mesh3ds_opengl_shader.cpp
@@ -57,6 +57,7 @@ void Mesh3DSOpenGLShader::render() {
 
 	_shader->enableVertexAttribute("position", _vertexBuffer, 3, GL_FLOAT, false, sizeof(Mesh3DSVertex), 0);
 	_shader->enableVertexAttribute("color", _vertexBuffer, 4, GL_FLOAT, false, sizeof(Mesh3DSVertex), 24);
+	_shader->setUniform("useTexture", false);
 
 	_shader->use(true);
 
diff --git a/engines/wintermute/base/gfx/opengl/meshx_opengl.cpp b/engines/wintermute/base/gfx/opengl/meshx_opengl.cpp
index 6aeb61d843a..cd606b4cd74 100644
--- a/engines/wintermute/base/gfx/opengl/meshx_opengl.cpp
+++ b/engines/wintermute/base/gfx/opengl/meshx_opengl.cpp
@@ -109,8 +109,8 @@ bool XMeshOpenGL::render(XModel *model) {
 			glEnable(GL_TEXTURE_2D);
 			static_cast<BaseSurfaceOpenGL3D *>(mat->getSurface())->setTexture();
 		} else {
-			glDisable(GL_TEXTURE_2D);
 			glBindTexture(GL_TEXTURE_2D, 0);
+			glDisable(GL_TEXTURE_2D);
 		}
 
 		if (mat->getEffect()) {
diff --git a/engines/wintermute/base/gfx/opengl/meshx_opengl_shader.cpp b/engines/wintermute/base/gfx/opengl/meshx_opengl_shader.cpp
index 6002e42f1a9..28618c3702e 100644
--- a/engines/wintermute/base/gfx/opengl/meshx_opengl_shader.cpp
+++ b/engines/wintermute/base/gfx/opengl/meshx_opengl_shader.cpp
@@ -130,22 +130,24 @@ bool XMeshOpenGLShader::render(XModel *model) {
 	_shader->enableVertexAttribute("position", _vertexBuffer, 3, GL_FLOAT, false, 4 * vertexSize, 0);
 	_shader->enableVertexAttribute("texcoord", _vertexBuffer, 2, GL_FLOAT, false, 4 * vertexSize, 4 * textureOffset);
 	_shader->enableVertexAttribute("normal", _vertexBuffer, 3, GL_FLOAT, false, 4 * vertexSize, 4 * normalOffset);
+	_shader->use(true);
 
 	for (uint32 i = 0; i < numAttrs; i++) {
 		Material *mat = _materials[attrs[i]._attribId];
 		if (mat->getSurface()) {
 			glEnable(GL_TEXTURE_2D);
 			static_cast<BaseSurfaceOpenGL3D *>(mat->getSurface())->setTexture();
+			_shader->setUniform("useTexture", true);
 		} else {
-			glDisable(GL_TEXTURE_2D);
+			_shader->setUniform("useTexture", false);
 			glBindTexture(GL_TEXTURE_2D, 0);
+			glDisable(GL_TEXTURE_2D);
 		}
 
 		if (mat->getEffect()) {
 			renderEffect(mat);
 		} else {
 			Math::Vector4d diffuse(mat->_material._diffuse._data);
-			_shader->use(true);
 			_shader->setUniform("diffuse", diffuse);
 			_shader->setUniform("ambient", diffuse);
 		}
@@ -202,7 +204,6 @@ bool XMeshOpenGLShader::update(FrameNode *parentFrame) {
 
 void XMeshOpenGLShader::renderEffect(Material *material) {
 	Math::Vector4d diffuse(material->_material._diffuse._data);
-	_shader->use(true);
 	_shader->setUniform("diffuse", diffuse);
 	_shader->setUniform("ambient", diffuse);
 }
diff --git a/engines/wintermute/base/gfx/opengl/shaders/wme_modelx.fragment b/engines/wintermute/base/gfx/opengl/shaders/wme_modelx.fragment
index 7f6231e4d18..1952c7bd500 100644
--- a/engines/wintermute/base/gfx/opengl/shaders/wme_modelx.fragment
+++ b/engines/wintermute/base/gfx/opengl/shaders/wme_modelx.fragment
@@ -4,12 +4,17 @@ in vec4 Color;
 uniform sampler2D tex;
 uniform float alphaRef;
 uniform UBOOL alphaTest;
+uniform UBOOL useTexture;
 
 OUTPUT
 
 void main() {
-	vec4 texColor = texture(tex, Texcoord);
-	outColor.rgba = texColor.rgba * Color.rgba;
+	if (useTexture) {
+		vec4 texColor = texture(tex, Texcoord);
+		outColor.rgba = texColor.rgba * Color.rgba;
+	} else {
+		outColor.rgba = Color.rgba;
+	}
 
 	if (UBOOL_TEST(alphaTest) && outColor.a < alphaRef) {
 		discard;
diff --git a/engines/wintermute/base/gfx/opengl/shaders/wme_sprite.vertex b/engines/wintermute/base/gfx/opengl/shaders/wme_sprite.vertex
index 76d15bc5e14..c01358b0a29 100644
--- a/engines/wintermute/base/gfx/opengl/shaders/wme_sprite.vertex
+++ b/engines/wintermute/base/gfx/opengl/shaders/wme_sprite.vertex
@@ -3,7 +3,6 @@ in vec2 texcoord;
 in vec4 color;
 
 uniform highp mat4 projMatrix;
-
 uniform highp mat3 transform;
 
 out vec2 Texcoord;




More information about the Scummvm-git-logs mailing list