[Scummvm-git-logs] scummvm master -> 5378ff61f2528c7e70796dd1335e3c12d400ce95

neuromancer noreply at scummvm.org
Tue Apr 4 17:59:59 UTC 2023


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

Summary:
a01431838d FREESCAPE: properly initialize _verts in shader renderer
7a96738168 GRAPHICS: OPENGL: added another setUniform function to set an uniform value in shaders from an array of ints
5378ff61f2 FREESCAPE: initial implementation of stipple patterns in shader renderer


Commit: a01431838df52511759fb5f89e08f144d57ca662
    https://github.com/scummvm/scummvm/commit/a01431838df52511759fb5f89e08f144d57ca662
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2023-04-04T20:00:17+02:00

Commit Message:
FREESCAPE: properly initialize _verts in shader renderer

Changed paths:
    engines/freescape/gfx_opengl_shaders.cpp


diff --git a/engines/freescape/gfx_opengl_shaders.cpp b/engines/freescape/gfx_opengl_shaders.cpp
index 9e067cfd426..53f263c56c1 100644
--- a/engines/freescape/gfx_opengl_shaders.cpp
+++ b/engines/freescape/gfx_opengl_shaders.cpp
@@ -46,6 +46,7 @@ Renderer *CreateGfxOpenGLShader(int screenW, int screenH, Common::RenderMode ren
 }
 
 OpenGLShaderRenderer::OpenGLShaderRenderer(int screenW, int screenH, Common::RenderMode renderMode) : Renderer(screenW, screenH, renderMode) {
+	_verts = nullptr;
 	_triangleShader = nullptr;
 	_triangleVBO = 0;
 


Commit: 7a967381681ba88f7a00864cbd118c87cdc1aa00
    https://github.com/scummvm/scummvm/commit/7a967381681ba88f7a00864cbd118c87cdc1aa00
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2023-04-04T20:00:17+02:00

Commit Message:
GRAPHICS: OPENGL: added another setUniform function to set an uniform value in shaders from an array of ints

Changed paths:
    graphics/opengl/shader.h


diff --git a/graphics/opengl/shader.h b/graphics/opengl/shader.h
index 16d908ec63d..185bd4fb063 100644
--- a/graphics/opengl/shader.h
+++ b/graphics/opengl/shader.h
@@ -131,6 +131,17 @@ public:
 		}
 	}
 
+	bool setUniform(const Common::String &uniform, const int size, const int *array) {
+		GLint pos = getUniformLocation(uniform);
+		if (pos != -1) {
+			use();
+			GL_CALL(glUniform1iv(pos, size, array));
+			return true;
+		} else {
+			return false;
+		}
+	}
+
 	// Different name to avoid overload ambiguity
 	bool setUniform1f(const Common::String &uniform, float f) {
 		GLint pos = getUniformLocation(uniform);


Commit: 5378ff61f2528c7e70796dd1335e3c12d400ce95
    https://github.com/scummvm/scummvm/commit/5378ff61f2528c7e70796dd1335e3c12d400ce95
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2023-04-04T20:00:17+02:00

Commit Message:
FREESCAPE: initial implementation of stipple patterns in shader renderer

Changed paths:
    engines/freescape/gfx_opengl_shaders.cpp
    engines/freescape/gfx_opengl_shaders.h
    engines/freescape/shaders/freescape_triangle.fragment


diff --git a/engines/freescape/gfx_opengl_shaders.cpp b/engines/freescape/gfx_opengl_shaders.cpp
index 53f263c56c1..d14ee7dc874 100644
--- a/engines/freescape/gfx_opengl_shaders.cpp
+++ b/engines/freescape/gfx_opengl_shaders.cpp
@@ -186,6 +186,7 @@ void OpenGLShaderRenderer::renderPlayerShoot(byte color, const Common::Point pos
 	identity(3, 3) = 1.0;
 
 	_triangleShader->use();
+	_triangleShader->setUniform("useStipple", false);
 	_triangleShader->setUniform("mvpMatrix", identity);
 
 	if (_renderMode == Common::kRenderCGA || _renderMode == Common::kRenderZX) {
@@ -281,30 +282,32 @@ void OpenGLShaderRenderer::polygonOffset(bool enabled) {
 }
 
 void OpenGLShaderRenderer::setStippleData(byte *data) {
+	_triangleShader->use();
 	if (!data)
 		return;
 
-	//_variableStippleArray = data;
-	//for (int i = 0; i < 128; i++)
-	//	_variableStippleArray[i] = data[(i / 16) % 4];
+	for (int i = 0; i < 8; i++) {
+		byte b = data[i];
+		for (int j = 0; j < 8; j++) {
+			//debug("%d", 8*i + j);
+			_variableStippleArray[8*i + j] = b & 0x1;
+			b = b >> 1;
+		}
+	}
+	_triangleShader->setUniform("stipple", 64, (const int*)&_variableStippleArray);
 }
 
 void OpenGLShaderRenderer::useStipple(bool enabled) {
-	/*if (enabled) {
+	_triangleShader->use();
+	if (enabled) {
 		glEnable(GL_POLYGON_OFFSET_FILL);
 		glPolygonOffset(0.0f, -1.0f);
-		glEnable(GL_POLYGON_STIPPLE);
-		if (_renderMode == Common::kRenderZX  ||
-			_renderMode == Common::kRenderCPC ||
-			_renderMode == Common::kRenderCGA)
-			glPolygonStipple(_variableStippleArray);
-		else
-			glPolygonStipple(_defaultStippleArray);
+		_triangleShader->setUniform("useStipple", true);
 	} else {
 		glPolygonOffset(0, 0);
 		glDisable(GL_POLYGON_OFFSET_FILL);
-		glDisable(GL_POLYGON_STIPPLE);
-	}*/
+		_triangleShader->setUniform("useStipple", false);
+	}
 }
 
 void OpenGLShaderRenderer::useColor(uint8 r, uint8 g, uint8 b) {
@@ -350,7 +353,6 @@ Graphics::Surface *OpenGLShaderRenderer::getScreenshot() {
 	glReadPixels(screen.left, screen.top, screen.width(), screen.height(), GL_RGBA, GL_UNSIGNED_BYTE, s->getPixels());
 	flipVertical(s);
 	return s;
-	return nullptr;
 }
 
 } // End of namespace Freescape
diff --git a/engines/freescape/gfx_opengl_shaders.h b/engines/freescape/gfx_opengl_shaders.h
index 1084a8fb1cb..ae3592a6587 100644
--- a/engines/freescape/gfx_opengl_shaders.h
+++ b/engines/freescape/gfx_opengl_shaders.h
@@ -58,17 +58,11 @@ public:
 		GLfloat y;
 	};
 
-	/*Coord *_coords;
-
-	void copyToCoordArray(uint idx, const Math::Vector2d &src) {
-		assert(idx < kCoordsArraySize);
-		_coords[idx].x = src.getValue(0); _coords[idx].y = src.getValue(1);
-	}*/
-
 	OpenGL::Shader *_triangleShader;
 	OpenGL::Shader *_bitmapShader;
 	GLuint _triangleVBO;
 	GLuint _bitmapVBO;
+	int _variableStippleArray[64];
 
 	virtual void init() override;
 	virtual void clear(uint8 color) override;
diff --git a/engines/freescape/shaders/freescape_triangle.fragment b/engines/freescape/shaders/freescape_triangle.fragment
index aaf98049c01..8ab397df899 100644
--- a/engines/freescape/shaders/freescape_triangle.fragment
+++ b/engines/freescape/shaders/freescape_triangle.fragment
@@ -1,8 +1,17 @@
 OUTPUT
 
+uniform UBOOL useStipple;
+uniform int stipple[64];
+
 varying vec4 var_color;
 
 void main()
 {
-    outColor = var_color;
+	if (UBOOL_TEST(useStipple)) {
+		ivec2 coord = ivec2(gl_FragCoord.xy - 0.5);
+		if (stipple[int(mod(coord.x, 8) + mod(coord.y, 8) * 8)] == 0)
+			discard;
+	}
+
+	outColor = var_color;
 }
\ No newline at end of file




More information about the Scummvm-git-logs mailing list