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

aquadran noreply at scummvm.org
Sun Nov 3 13:17:24 UTC 2024


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:
bfa7d4866d WINTERMUTE: Sync both renderers


Commit: bfa7d4866d0f29725891dfc710261d8f1180f6dc
    https://github.com/scummvm/scummvm/commit/bfa7d4866d0f29725891dfc710261d8f1180f6dc
Author: Paweł Kołodziejski (aquadran at gmail.com)
Date: 2024-11-03T14:17:13+01:00

Commit Message:
WINTERMUTE: Sync both renderers

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/base_render_opengl3d_shader.h
    engines/wintermute/base/gfx/opengl/shadow_volume_opengl_shader.cpp


diff --git a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
index bf477765b71..109e092f97e 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
@@ -137,7 +137,7 @@ bool BaseRenderOpenGL3D::setup2D(bool force) {
 		glAlphaFunc(GL_GEQUAL, 0.0f);
 
 		glPolygonMode(GL_FRONT, GL_FILL);
-		glFrontFace(GL_CCW); // DX have CW
+		glFrontFace(GL_CCW);  // WME DX have CW
 		glEnable(GL_CULL_FACE);
 		glDisable(GL_STENCIL_TEST);
 
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 b43ab6c296d..1333ce66e11 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
@@ -48,6 +48,7 @@ BaseRenderer3D *makeOpenGL3DShaderRenderer(BaseGame *inGame) {
 }
 
 BaseRenderOpenGL3DShader::BaseRenderOpenGL3DShader(BaseGame *inGame) : BaseRenderer3D(inGame) {
+	setDefaultAmbientLightColor();
 	_spriteVBO = 0;
 }
 
@@ -150,15 +151,18 @@ bool BaseRenderOpenGL3DShader::setup2D(bool force) {
 	if (_state != RSTATE_2D || force) {
 		_state = RSTATE_2D;
 
-		// some states are still missing here
+		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 
 		glDisable(GL_DEPTH_TEST);
-		glDisable(GL_STENCIL_TEST);
 
-		glEnable(GL_CULL_FACE);
-		glFrontFace(GL_CCW);  // WME DX have CW
 		glEnable(GL_BLEND);
-		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+		setSpriteBlendMode(Graphics::BLEND_NORMAL);
+
+		glPolygonMode(GL_FRONT, GL_FILL);
+		glFrontFace(GL_CCW);  // WME DX have CW
+		glEnable(GL_CULL_FACE);
+		glDisable(GL_STENCIL_TEST);
 	}
 
 	return true;
@@ -168,11 +172,18 @@ bool BaseRenderOpenGL3DShader::setup3D(Camera3D *camera, bool force) {
 	if (_state != RSTATE_3D || force) {
 		_state = RSTATE_3D;
 
+		glEnable(GL_NORMALIZE);
+
+		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
+
 		glEnable(GL_DEPTH_TEST);
-		glEnable(GL_BLEND);
 
 		setAmbientLightRenderState();
 
+		glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+
+
 		if (camera)
 			_camera = camera;
 		if (_camera) {
@@ -239,12 +250,17 @@ bool BaseRenderOpenGL3DShader::setup3D(Camera3D *camera, bool force) {
 }
 
 void BaseRenderOpenGL3DShader::setAmbientLightRenderState() {
-	byte a = RGBCOLGetA(_ambientLightColor);
-	byte r = RGBCOLGetR(_ambientLightColor);
-	byte g = RGBCOLGetG(_ambientLightColor);
-	byte b = RGBCOLGetB(_ambientLightColor);
-
-	if (!_ambientLightOverride) {
+	byte a = 0;
+	byte r = 0;
+	byte g = 0;
+	byte b = 0;
+
+	if (_ambientLightOverride) {
+		a = RGBCOLGetA(_ambientLightColor);
+		r = RGBCOLGetR(_ambientLightColor);
+		g = RGBCOLGetG(_ambientLightColor);
+		b = RGBCOLGetB(_ambientLightColor);
+	} else {
 		uint32 color = _gameRef->getAmbientLightColor();
 
 		a = RGBCOLGetA(color);
@@ -259,20 +275,24 @@ void BaseRenderOpenGL3DShader::setAmbientLightRenderState() {
 	value.z() = b / 255.0f;
 	value.w() = a / 255.0f;
 
-	_xmodelShader->use();
-	_xmodelShader->setUniform("ambientLight", value);
+	if (_xmodelShader) {
+		_xmodelShader->use();
+		_xmodelShader->setUniform("ambientLight", value);
+	}
 }
 
 bool BaseRenderOpenGL3DShader::setupLines() {
 	if (_state != RSTATE_LINES) {
 		_state = RSTATE_LINES;
 
+		glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
 		glDisable(GL_DEPTH_TEST);
 		glFrontFace(GL_CW); // WME DX have CCW
 		glEnable(GL_CULL_FACE);
 		glEnable(GL_BLEND);
 		glEnable(GL_ALPHA_TEST);
 
+		glDisable(GL_TEXTURE_2D);
 		glBindTexture(GL_TEXTURE_2D, 0);
 		_lastTexture = nullptr;
 	}
@@ -300,13 +320,6 @@ bool BaseRenderOpenGL3DShader::drawSpriteEx(BaseSurface *tex, const Wintermute::
 	float width = (rect.right - rect.left) * scale.x;
 	float height = (rect.bottom - rect.top) * scale.y;
 
-	glBindTexture(GL_TEXTURE_2D, texture->getTextureName());
-
-	// for sprites we clamp to the edge, to avoid line fragments at the edges
-	// this is not done by wme, though
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-
 	int texWidth = texture->getGLTextureWidth();
 	int texHeight = texture->getGLTextureHeight();
 
@@ -390,6 +403,20 @@ bool BaseRenderOpenGL3DShader::drawSpriteEx(BaseSurface *tex, const Wintermute::
 		// TODO
 	} else {
 		setSpriteBlendMode(blendMode);
+		if (alphaDisable) {
+			glDisable(GL_ALPHA_TEST);
+		}
+
+		if (_lastTexture != texture) {
+			_lastTexture = texture;
+			glBindTexture(GL_TEXTURE_2D, texture->getTextureName());
+			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+			// for sprites we clamp to the edge, to avoid line fragments at the edges
+			// this is not done by wme, though
+			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+			glEnable(GL_TEXTURE_2D);
+		}
 
 		glBindBuffer(GL_ARRAY_BUFFER, _spriteVBO);
 		glBufferSubData(GL_ARRAY_BUFFER, 0, 4 * sizeof(SpriteVertex), vertices);
@@ -399,6 +426,10 @@ bool BaseRenderOpenGL3DShader::drawSpriteEx(BaseSurface *tex, const Wintermute::
 		setProjection2D(_spriteShader);
 
 		glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+
+		if (alphaDisable) {
+			glEnable(GL_BLEND);
+		}
 	}
 
 	return true;
@@ -565,6 +596,7 @@ void BaseRenderOpenGL3DShader::fadeToColor(byte r, byte g, byte b, byte a) {
 	glEnable(GL_BLEND);
 	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 	glBindTexture(GL_TEXTURE_2D, 0);
+	glDisable(GL_TEXTURE_2D);
 	glBindBuffer(GL_ARRAY_BUFFER, _fadeVBO);
 	_lastTexture = nullptr;
 
@@ -727,6 +759,7 @@ void BaseRenderOpenGL3DShader::renderShadowGeometry(const BaseArray<AdWalkplane
 
 	// no texture
 	_lastTexture = nullptr;
+	glDisable(GL_TEXTURE_2D);
 	glBindTexture(GL_TEXTURE_2D, 0);
 
 	glFrontFace(GL_CW); // WME DX have CCW
@@ -862,6 +895,8 @@ ShadowVolume *BaseRenderOpenGL3DShader::createShadowVolume() {
 	return new ShadowVolumeOpenGLShader(_gameRef, _shadowVolumeShader, _shadowMaskShader);
 }
 
+// ScummVM specific ends <--
+
 } // namespace Wintermute
 
 #endif // defined(USE_OPENGL_SHADERS)
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 18a18f97664..f80a6b9c6fb 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h
@@ -146,12 +146,12 @@ private:
 	GLuint _spriteVBO;
 	GLuint _fadeVBO;
 	GLuint _lineVBO;
-	OpenGL::Shader *_spriteShader;
-	OpenGL::Shader *_fadeShader;
-	OpenGL::Shader *_xmodelShader;
-	OpenGL::Shader *_geometryShader;
-	OpenGL::Shader *_shadowVolumeShader;
-	OpenGL::Shader *_lineShader;
+	OpenGL::Shader *_spriteShader{};
+	OpenGL::Shader *_fadeShader{};
+	OpenGL::Shader *_xmodelShader{};
+	OpenGL::Shader *_geometryShader{};
+	OpenGL::Shader *_shadowVolumeShader{};
+	OpenGL::Shader *_lineShader{};
 };
 
 } // namespace Wintermute
diff --git a/engines/wintermute/base/gfx/opengl/shadow_volume_opengl_shader.cpp b/engines/wintermute/base/gfx/opengl/shadow_volume_opengl_shader.cpp
index c931fd41659..3cc41ec8686 100644
--- a/engines/wintermute/base/gfx/opengl/shadow_volume_opengl_shader.cpp
+++ b/engines/wintermute/base/gfx/opengl/shadow_volume_opengl_shader.cpp
@@ -73,8 +73,9 @@ ShadowVolumeOpenGLShader::~ShadowVolumeOpenGLShader() {
 //////////////////////////////////////////////////////////////////////////
 bool ShadowVolumeOpenGLShader::render() {
 	glBindTexture(GL_TEXTURE_2D, 0);
-	glDrawArrays(GL_TRIANGLES, 0, _vertices.size());
+	glDisable(GL_TEXTURE_2D);
 	_gameRef->_renderer3D->_lastTexture = nullptr;
+	glDrawArrays(GL_TRIANGLES, 0, _vertices.size());
 
 	return true;
 }
@@ -96,6 +97,7 @@ bool ShadowVolumeOpenGLShader::renderToStencilBuffer() {
 	// Disable z-buffer writes (note: z-testing still occurs), and enable the
 	// stencil-buffer
 	glDepthMask(GL_FALSE);
+	glDisable(GL_TEXTURE_2D);
 	glEnable(GL_STENCIL_TEST);
 	glEnable(GL_CULL_FACE);
 




More information about the Scummvm-git-logs mailing list