[Scummvm-git-logs] scummvm master -> 7a4b769887ce89bc51a3a003ce4423738f7ae352

aquadran aquadran at gmail.com
Wed Oct 27 20:31:53 UTC 2021


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:
7a4b769887 PLAYGROUND3D: Added dimming test using vertex arrays


Commit: 7a4b769887ce89bc51a3a003ce4423738f7ae352
    https://github.com/scummvm/scummvm/commit/7a4b769887ce89bc51a3a003ce4423738f7ae352
Author: Paweł Kołodziejski (aquadran at gmail.com)
Date: 2021-10-27T22:31:47+02:00

Commit Message:
PLAYGROUND3D: Added dimming test using vertex arrays

Changed paths:
  A engines/playground3d/shaders/playground3d_fade.fragment
  A engines/playground3d/shaders/playground3d_fade.vertex
    dists/scummvm.rc
    engines/playground3d/gfx.h
    engines/playground3d/gfx_opengl.cpp
    engines/playground3d/gfx_opengl.h
    engines/playground3d/gfx_opengl_shaders.cpp
    engines/playground3d/gfx_opengl_shaders.h
    engines/playground3d/gfx_tinygl.cpp
    engines/playground3d/gfx_tinygl.h
    engines/playground3d/playground3d.cpp
    engines/playground3d/playground3d.h
    engines/playground3d/shaders/playground3d_cube.fragment
    engines/playground3d/shaders/playground3d_cube.vertex


diff --git a/dists/scummvm.rc b/dists/scummvm.rc
index 56cff34f63..a5206a2f36 100644
--- a/dists/scummvm.rc
+++ b/dists/scummvm.rc
@@ -167,10 +167,10 @@ shaders/stark_shadow.vertex          FILE    "engines/stark/shaders/stark_shadow
 #if PLUGIN_ENABLED_STATIC(WINTERMUTE)
 shaders/wme_fade.fragment               FILE    "engines/wintermute/base/gfx/opengl/shaders/wme_fade.fragment"
 shaders/wme_fade.vertex                 FILE    "engines/wintermute/base/gfx/opengl/shaders/wme_fade.vertex"
-shaders/wme_flat_shadow_mask.fragment   FILE "engines/wintermute/base/gfx/opengl/shaders/wme_flat_shadow_mask.fragment"
-shaders/wme_flat_shadow_mask.vertex     FILE "engines/wintermute/base/gfx/opengl/shaders/wme_flat_shadow_mask.vertex"
-shaders/wme_flat_shadow_modelx.fragment FILE "engines/wintermute/base/gfx/opengl/shaders/wme_flat_shadow_modelx.fragment"
-shaders/wme_flat_shadow_modelx.vertex   FILE "engines/wintermute/base/gfx/opengl/shaders/wme_flat_shadow_modelx.vertex"
+shaders/wme_flat_shadow_mask.fragment   FILE    "engines/wintermute/base/gfx/opengl/shaders/wme_flat_shadow_mask.fragment"
+shaders/wme_flat_shadow_mask.vertex     FILE    "engines/wintermute/base/gfx/opengl/shaders/wme_flat_shadow_mask.vertex"
+shaders/wme_flat_shadow_modelx.fragment FILE    "engines/wintermute/base/gfx/opengl/shaders/wme_flat_shadow_modelx.fragment"
+shaders/wme_flat_shadow_modelx.vertex   FILE    "engines/wintermute/base/gfx/opengl/shaders/wme_flat_shadow_modelx.vertex"
 shaders/wme_geometry.fragment           FILE    "engines/wintermute/base/gfx/opengl/shaders/wme_geometry.fragment"
 shaders/wme_geometry.vertex             FILE    "engines/wintermute/base/gfx/opengl/shaders/wme_geometry.vertex"
 shaders/wme_line.fragment               FILE    "engines/wintermute/base/gfx/opengl/shaders/wme_line.fragment"
@@ -187,6 +187,8 @@ shaders/wme_sprite.vertex               FILE    "engines/wintermute/base/gfx/ope
 #if PLUGIN_ENABLED_STATIC(PLAYGROUND3D)
 shaders/playground3d_cube.fragment      FILE    "engines/playground3d/shaders/playground3d_cube.fragment"
 shaders/playground3d_cube.vertex        FILE    "engines/playground3d/shaders/playground3d_cube.vertex"
+shaders/playground3d_fade.fragment      FILE    "engines/playground3d/shaders/playground3d_fade.fragment"
+shaders/playground3d_fade.vertex        FILE    "engines/playground3d/shaders/playground3d_fade.vertex"
 #endif
 #endif
 #endif
diff --git a/engines/playground3d/gfx.h b/engines/playground3d/gfx.h
index 836e415347..a6ced749ab 100644
--- a/engines/playground3d/gfx.h
+++ b/engines/playground3d/gfx.h
@@ -38,7 +38,7 @@ public:
 	virtual ~Renderer();
 
 	virtual void init() = 0;
-	virtual void clear() = 0;
+	virtual void clear(const Math::Vector4d &clearColor) = 0;
 
 	/**
 	 *  Swap the buffers, making the drawn screen visible
@@ -56,6 +56,7 @@ public:
 
 	virtual void drawCube(const Math::Vector3d &pos, const Math::Vector3d &roll) = 0;
 	virtual void drawPolyOffsetTest(const Math::Vector3d &pos, const Math::Vector3d &roll) = 0;
+	virtual void dimRegionInOut(float fade) = 0;
 
 protected:
 	OSystem *_system;
diff --git a/engines/playground3d/gfx_opengl.cpp b/engines/playground3d/gfx_opengl.cpp
index 1532c34718..e7044bb2b3 100644
--- a/engines/playground3d/gfx_opengl.cpp
+++ b/engines/playground3d/gfx_opengl.cpp
@@ -33,6 +33,14 @@
 
 namespace Playground3d {
 
+static const GLfloat dimRegionVertices[] = {
+	//  X      Y
+	-0.5f,  0.5f,
+	 0.5f,  0.5f,
+	-0.5f, -0.5f,
+	 0.5f, -0.5f,
+};
+
 Renderer *CreateGfxOpenGL(OSystem *system) {
 	return new OpenGLRenderer(system);
 }
@@ -60,12 +68,13 @@ void OpenGLRenderer::init() {
 	glMatrixMode(GL_MODELVIEW);
 	glLoadIdentity();
 
+	glDisable(GL_TEXTURE_2D);
 	glDisable(GL_LIGHTING);
 	glEnable(GL_DEPTH_TEST);
 }
 
-void OpenGLRenderer::clear() {
-	glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
+void OpenGLRenderer::clear(const Math::Vector4d &clearColor) {
+	glClearColor(clearColor.x(), clearColor.y(), clearColor.z(), clearColor.w());
 	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 }
 
@@ -130,6 +139,36 @@ void OpenGLRenderer::drawPolyOffsetTest(const Math::Vector3d &pos, const Math::V
 	glDisable(GL_POLYGON_OFFSET_FILL);
 }
 
+void OpenGLRenderer::dimRegionInOut(float fade) {
+	Common::Rect vp = viewport();
+	glViewport(vp.left, _system->getHeight() - vp.top - vp.height(), vp.width(), vp.height());
+
+	glMatrixMode(GL_PROJECTION);
+	glPushMatrix();
+	glLoadIdentity();
+
+	glMatrixMode(GL_MODELVIEW);
+	glPushMatrix();
+	glLoadIdentity();
+
+	glEnable(GL_BLEND);
+	glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+	glDisable(GL_DEPTH_TEST);
+	glDepthMask(GL_FALSE);
+
+	glColor4f(0.0f, 0.0f, 0.0f, 1.0f - fade);
+	glEnableClientState(GL_VERTEX_ARRAY);
+	glVertexPointer(2, GL_FLOAT, 2 * sizeof(GLfloat), &dimRegionVertices[0]);
+	glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+	glDisableClientState(GL_VERTEX_ARRAY);
+
+	glMatrixMode(GL_MODELVIEW);
+	glPopMatrix();
+
+	glMatrixMode(GL_PROJECTION);
+	glPopMatrix();
+}
+
 } // End of namespace Playground3d
 
 #endif
diff --git a/engines/playground3d/gfx_opengl.h b/engines/playground3d/gfx_opengl.h
index b2dc406c39..f8a9fd6d60 100644
--- a/engines/playground3d/gfx_opengl.h
+++ b/engines/playground3d/gfx_opengl.h
@@ -41,10 +41,11 @@ public:
 
 	virtual void init() override;
 
-	virtual void clear() override;
+	virtual void clear(const Math::Vector4d &clearColor) override;
 
 	virtual void drawCube(const Math::Vector3d &pos, const Math::Vector3d &roll) override;
 	virtual void drawPolyOffsetTest(const Math::Vector3d &pos, const Math::Vector3d &roll) override;
+	virtual void dimRegionInOut(float fade) override;
 
 private:
 	void drawFace(uint face);
diff --git a/engines/playground3d/gfx_opengl_shaders.cpp b/engines/playground3d/gfx_opengl_shaders.cpp
index 20cf813397..bdea48e9a5 100644
--- a/engines/playground3d/gfx_opengl_shaders.cpp
+++ b/engines/playground3d/gfx_opengl_shaders.cpp
@@ -39,6 +39,14 @@
 
 namespace Playground3d {
 
+static const GLfloat dimRegionVertices[] = {
+	//  X      Y
+	-0.5f,  0.5f,
+	 0.5f,  0.5f,
+	-0.5f, -0.5f,
+	 0.5f, -0.5f,
+};
+
 Renderer *CreateGfxOpenGLShader(OSystem *system) {
 	return new ShaderRenderer(system);
 }
@@ -47,13 +55,17 @@ ShaderRenderer::ShaderRenderer(OSystem *system) :
 		Renderer(system),
 		_currentViewport(kOriginalWidth, kOriginalHeight),
 		_cubeShader(nullptr),
-		_cubeVBO(0) {
+		_fadeShader(nullptr),
+		_cubeVBO(0),
+		_fadeVBO(0) {
 }
 
 ShaderRenderer::~ShaderRenderer() {
 	OpenGL::ShaderGL::freeBuffer(_cubeVBO);
+	OpenGL::ShaderGL::freeBuffer(_fadeVBO);
 
 	delete _cubeShader;
+	delete _fadeShader;
 }
 
 void ShaderRenderer::init() {
@@ -63,17 +75,22 @@ void ShaderRenderer::init() {
 
 	glEnable(GL_DEPTH_TEST);
 
-	static const char* attributes[] = { "position", "normal", "color", "texcoord",  NULL };
-	_cubeShader = OpenGL::ShaderGL::fromFiles("playground3d_cube", attributes);
+	static const char *cubeAttributes[] = { "position", "normal", "color", "texcoord", NULL };
+	_cubeShader = OpenGL::ShaderGL::fromFiles("playground3d_cube", cubeAttributes);
 	_cubeVBO = OpenGL::ShaderGL::createBuffer(GL_ARRAY_BUFFER, sizeof(cubeVertices), cubeVertices);
 	_cubeShader->enableVertexAttribute("texcoord", _cubeVBO, 2, GL_FLOAT, GL_FALSE, 11 * sizeof(float), 0);
 	_cubeShader->enableVertexAttribute("position", _cubeVBO, 3, GL_FLOAT, GL_FALSE, 11 * sizeof(float), 8);
 	_cubeShader->enableVertexAttribute("normal", _cubeVBO, 3, GL_FLOAT, GL_FALSE, 11 * sizeof(float), 20);
 	_cubeShader->enableVertexAttribute("color", _cubeVBO, 3, GL_FLOAT, GL_FALSE, 11 * sizeof(float), 32);
+
+	static const char* fadeAttributes[] = { "position", nullptr };
+	_fadeShader = OpenGL::ShaderGL::fromFiles("playground3d_fade", fadeAttributes);
+	_fadeVBO = OpenGL::ShaderGL::createBuffer(GL_ARRAY_BUFFER, sizeof(dimRegionVertices), dimRegionVertices);
+	_fadeShader->enableVertexAttribute("position", _fadeVBO, 2, GL_FLOAT, GL_TRUE, 2 * sizeof(float), 0);
 }
 
-void ShaderRenderer::clear() {
-	glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
+void ShaderRenderer::clear(const Math::Vector4d &clearColor) {
+	glClearColor(clearColor.x(), clearColor.y(), clearColor.z(), clearColor.w());
 	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 }
 
@@ -100,6 +117,21 @@ void ShaderRenderer::drawPolyOffsetTest(const Math::Vector3d &pos, const Math::V
 	error("Polygon offset test not implemented yet");
 }
 
+void ShaderRenderer::dimRegionInOut(float fade) {
+	Common::Rect vp = viewport();
+	glViewport(vp.left, _system->getHeight() - vp.top - vp.height(), vp.width(), vp.height());
+
+	glEnable(GL_BLEND);
+	glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+	glDisable(GL_DEPTH_TEST);
+	glDepthMask(GL_FALSE);
+
+	_fadeShader->use();
+	_fadeShader->setUniform1f("alphaLevel", 1.0 - fade);
+	glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+	_fadeShader->unbind();
+}
+
 } // End of namespace Playground3d
 
 #endif
diff --git a/engines/playground3d/gfx_opengl_shaders.h b/engines/playground3d/gfx_opengl_shaders.h
index 9ad655d0ec..ff6dd2ab47 100644
--- a/engines/playground3d/gfx_opengl_shaders.h
+++ b/engines/playground3d/gfx_opengl_shaders.h
@@ -41,15 +41,18 @@ public:
 
 	virtual void init() override;
 
-	virtual void clear() override;
+	virtual void clear(const Math::Vector4d &clearColor) override;
 
 	virtual void drawCube(const Math::Vector3d &pos, const Math::Vector3d &roll) override;
 	virtual void drawPolyOffsetTest(const Math::Vector3d &pos, const Math::Vector3d &roll) override;
+	virtual void dimRegionInOut(float fade) override;
 
 private:
 	OpenGL::ShaderGL *_cubeShader;
+	OpenGL::ShaderGL *_fadeShader;
 
 	GLuint _cubeVBO;
+	GLuint _fadeVBO;
 
 	Common::Rect _currentViewport;
 };
diff --git a/engines/playground3d/gfx_tinygl.cpp b/engines/playground3d/gfx_tinygl.cpp
index dfc4960a01..a4ed0ec92a 100644
--- a/engines/playground3d/gfx_tinygl.cpp
+++ b/engines/playground3d/gfx_tinygl.cpp
@@ -35,6 +35,18 @@
 
 namespace Playground3d {
 
+static const TGLfloat dimRegionVertices[] = {
+	//  X      Y
+	-0.5f,  0.5f,
+	 0.5f,  0.5f,
+	-0.5f, -0.5f,
+	 0.5f, -0.5f,
+};
+
+static const TGLuint dimRegionIndices[] = {
+	0, 1, 2, 3
+};
+
 Renderer *CreateGfxTinyGL(OSystem *system) {
 	return new TinyGLRenderer(system);
 }
@@ -66,8 +78,8 @@ void TinyGLRenderer::init() {
 	tglEnable(TGL_DEPTH_TEST);
 }
 
-void TinyGLRenderer::clear() {
-	tglClearColor(0.5f, 0.5f, 0.5f, 1.0f);
+void TinyGLRenderer::clear(const Math::Vector4d &clearColor) {
+	tglClearColor(clearColor.x(), clearColor.y(), clearColor.z(), clearColor.w());
 	tglClear(TGL_COLOR_BUFFER_BIT | TGL_DEPTH_BUFFER_BIT);
 }
 
@@ -137,4 +149,36 @@ void TinyGLRenderer::flipBuffer() {
 	g_system->copyRectToScreen(_fb->getPixelBuffer(), _fb->linesize, 0, 0, _fb->xsize, _fb->ysize);
 }
 
+void TinyGLRenderer::dimRegionInOut(float fade) {
+	Common::Rect vp = viewport();
+	tglViewport(vp.left, _system->getHeight() - vp.top - vp.height(), vp.width(), vp.height());
+
+	tglMatrixMode(TGL_PROJECTION);
+	tglPushMatrix();
+	tglLoadIdentity();
+
+	tglMatrixMode(TGL_MODELVIEW);
+	tglPushMatrix();
+	tglLoadIdentity();
+
+	tglEnable(TGL_BLEND);
+	tglBlendFunc(TGL_ONE, TGL_ONE_MINUS_SRC_ALPHA);
+	tglDisable(TGL_DEPTH_TEST);
+	tglDepthMask(TGL_FALSE);
+
+	tglColor4f(0.0f, 0.0f, 0.0f, 1.0f - fade);
+
+	tglEnableClientState(TGL_VERTEX_ARRAY);
+	tglVertexPointer(2, TGL_FLOAT, 0, dimRegionVertices);
+	tglDrawElements(TGL_TRIANGLE_STRIP, 4, TGL_UNSIGNED_INT, dimRegionIndices);
+	//tglDrawArrays(TGL_TRIANGLE_STRIP, 0, 4);
+	tglDisableClientState(TGL_VERTEX_ARRAY);
+
+	tglMatrixMode(TGL_MODELVIEW);
+	tglPopMatrix();
+
+	tglMatrixMode(TGL_PROJECTION);
+	tglPopMatrix();
+}
+
 } // End of namespace Playground3d
diff --git a/engines/playground3d/gfx_tinygl.h b/engines/playground3d/gfx_tinygl.h
index 0b435192ee..03ae1561ff 100644
--- a/engines/playground3d/gfx_tinygl.h
+++ b/engines/playground3d/gfx_tinygl.h
@@ -41,10 +41,11 @@ public:
 
 	virtual void init() override;
 
-	virtual void clear() override;
+	virtual void clear(const Math::Vector4d &clearColor) override;
 
 	virtual void drawCube(const Math::Vector3d &pos, const Math::Vector3d &roll) override;
 	virtual void drawPolyOffsetTest(const Math::Vector3d &pos, const Math::Vector3d &roll) override;
+	virtual void dimRegionInOut(float fade) override;
 
 	virtual void flipBuffer() override;
 
diff --git a/engines/playground3d/playground3d.cpp b/engines/playground3d/playground3d.cpp
index 68184553bf..79d5ed3d02 100644
--- a/engines/playground3d/playground3d.cpp
+++ b/engines/playground3d/playground3d.cpp
@@ -46,7 +46,8 @@ bool Playground3dEngine::hasFeature(EngineFeature f) const {
 
 Playground3dEngine::Playground3dEngine(OSystem *syst)
 		: Engine(syst), _system(syst), _frameLimiter(0),
-		_rotateAngleX(0), _rotateAngleY(0), _rotateAngleZ(0) {
+		_rotateAngleX(0), _rotateAngleY(0), _rotateAngleZ(0),
+		_clearColor(0.0f, 0.0f, 0.0f, 1.0f), _fade(1.0f), _fadeIn(false) {
 }
 
 Playground3dEngine::~Playground3dEngine() {
@@ -57,21 +58,25 @@ Playground3dEngine::~Playground3dEngine() {
 Common::Error Playground3dEngine::run() {
 	_gfx = createRenderer(_system);
 	_gfx->init();
-	_gfx->clear();
 
 	_frameLimiter = new Gfx::FrameLimiter(_system, ConfMan.getInt("engine_speed"));
 
 	_system->showMouse(true);
 
 	// 1 - rotated colorfull cube
-	// 2 - rotated two traingles with depth offset
+	// 2 - rotated two triangles with depth offset
+	// 3 - fade in/out
 	int testId = 1;
 
 	switch (testId) {
 		case 1:
+			_clearColor = Math::Vector4d(0.5f, 0.5f, 0.5f, 1.0f);
 			_rotateAngleX = 45, _rotateAngleY = 45, _rotateAngleZ = 10;
 			break;
 		case 2:
+			_clearColor = Math::Vector4d(0.5f, 0.5f, 0.5f, 1.0f);
+		case 3:
+			_clearColor = Math::Vector4d(1.0f, 0.0f, 0.0f, 1.0f);
 			break;
 		default:
 			assert(false);
@@ -119,8 +124,23 @@ void Playground3dEngine::drawPolyOffsetTest() {
 		_rotateAngleY = 0;
 }
 
+void Playground3dEngine::dimRegionInOut() {
+	_gfx->dimRegionInOut(_fade);
+	if (_fadeIn)
+		_fade += 0.01f;
+	else
+		_fade -= 0.01f;
+	if (_fade > 1.0f) {
+		_fade = 1;
+		_fadeIn = false;
+	} else if (_fade < 0.0f) {
+		_fade = 0;
+		_fadeIn = true;
+	}
+}
+
 void Playground3dEngine::drawFrame(int testId) {
-	_gfx->clear();
+	_gfx->clear(_clearColor);
 
 	float pitch = 0.0f;
 	float heading = 0.0f;
@@ -134,6 +154,9 @@ void Playground3dEngine::drawFrame(int testId) {
 		case 2:
 			drawPolyOffsetTest();
 			break;
+		case 3:
+			dimRegionInOut();
+			break;
 		default:
 			assert(false);
 	}
diff --git a/engines/playground3d/playground3d.h b/engines/playground3d/playground3d.h
index 8a23f5a961..b571f53321 100644
--- a/engines/playground3d/playground3d.h
+++ b/engines/playground3d/playground3d.h
@@ -49,11 +49,15 @@ private:
 	OSystem *_system;
 	Renderer *_gfx;
 	Gfx::FrameLimiter *_frameLimiter;
+	Math::Vector4d _clearColor;
+	float _fade;
+	bool _fadeIn;
 
 	float _rotateAngleX, _rotateAngleY, _rotateAngleZ;
 
 	void drawAndRotateCube();
 	void drawPolyOffsetTest();
+	void dimRegionInOut();
 };
 
 } // End of namespace Playground3d
diff --git a/engines/playground3d/shaders/playground3d_cube.fragment b/engines/playground3d/shaders/playground3d_cube.fragment
index 433e5d0eb5..d6917e6b25 100644
--- a/engines/playground3d/shaders/playground3d_cube.fragment
+++ b/engines/playground3d/shaders/playground3d_cube.fragment
@@ -6,8 +6,7 @@ OUTPUT
 uniform bool textured;
 uniform sampler2D tex;
 
-void main()
-{
+void main() {
 	outColor = vec4(Color, 1.0);
 	if (textured) {
 		outColor *= texture(tex, Texcoord);
diff --git a/engines/playground3d/shaders/playground3d_cube.vertex b/engines/playground3d/shaders/playground3d_cube.vertex
index 6286101032..05f4126c82 100644
--- a/engines/playground3d/shaders/playground3d_cube.vertex
+++ b/engines/playground3d/shaders/playground3d_cube.vertex
@@ -13,8 +13,7 @@ uniform vec3 modelPos;
 out vec2 Texcoord;
 out vec3 Color;
 
-void main()
-{
+void main() {
 	Texcoord = texcoord;
 
 	vec4 pos = rotateMatrix * vec4(position, 1.0);
diff --git a/engines/playground3d/shaders/playground3d_fade.fragment b/engines/playground3d/shaders/playground3d_fade.fragment
new file mode 100644
index 0000000000..069bdba5cf
--- /dev/null
+++ b/engines/playground3d/shaders/playground3d_fade.fragment
@@ -0,0 +1,8 @@
+
+OUTPUT
+
+uniform float alphaLevel;
+
+void main() {
+	outColor = vec4(0.0, 0.0, 0.0, alphaLevel);
+}
diff --git a/engines/playground3d/shaders/playground3d_fade.vertex b/engines/playground3d/shaders/playground3d_fade.vertex
new file mode 100644
index 0000000000..92f62ba08e
--- /dev/null
+++ b/engines/playground3d/shaders/playground3d_fade.vertex
@@ -0,0 +1,5 @@
+in vec2 position;
+
+void main() {
+	gl_Position = vec4(position, 0.0, 1.0);
+}




More information about the Scummvm-git-logs mailing list