[Scummvm-git-logs] scummvm master -> 90114aefb29e7b6007105c4ad3dd514fc05a82d5

aquadran noreply at scummvm.org
Sun Sep 28 14:21:51 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:
90114aefb2 WINTERMUTE: Restored DrawLine/DrawRect


Commit: 90114aefb29e7b6007105c4ad3dd514fc05a82d5
    https://github.com/scummvm/scummvm/commit/90114aefb29e7b6007105c4ad3dd514fc05a82d5
Author: Paweł Kołodziejski (aquadran at gmail.com)
Date: 2025-09-28T16:21:46+02:00

Commit Message:
WINTERMUTE: Restored DrawLine/DrawRect

Changed paths:
    engines/wintermute/base/gfx/base_renderer.cpp
    engines/wintermute/base/gfx/base_renderer.h
    engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
    engines/wintermute/base/gfx/opengl/base_render_opengl3d.h
    engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
    engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h
    engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
    engines/wintermute/base/gfx/osystem/base_render_osystem.h


diff --git a/engines/wintermute/base/gfx/base_renderer.cpp b/engines/wintermute/base/gfx/base_renderer.cpp
index c4ce8db9f35..6acc659693d 100644
--- a/engines/wintermute/base/gfx/base_renderer.cpp
+++ b/engines/wintermute/base/gfx/base_renderer.cpp
@@ -154,6 +154,23 @@ bool BaseRenderer::setup3D(Camera3D *camera, bool force) {
 }
 #endif
 
+//////////////////////////////////////////////////////////////////////////
+bool BaseRenderer::drawLine(int x1, int y1, int x2, int y2, uint32 color) {
+	return STATUS_FAILED;
+}
+
+//////////////////////////////////////////////////////////////////////////
+bool BaseRenderer::drawRect(int x1, int y1, int x2, int y2, uint32 color, int width) {
+	for (int i = 0; i < width; i++) {
+		drawLine(x1 + i, y1 + i, x2 - i,     y1 + i, color); // up
+		drawLine(x1 + i, y2 - i, x2 - i + 1, y2 - i, color); // down
+		
+		drawLine(x1 + i, y1 + i, x1 + i, y2 - i,     color); // left
+		drawLine(x2 - i, y1 + i, x2 - i, y2 - i + 1, color); // right
+	}
+	return STATUS_OK;
+}
+
 //////////////////////////////////////////////////////////////////////////
 bool BaseRenderer::fillRect(int x, int y, int w, int h, uint32 color) {
 	return STATUS_FAILED;
diff --git a/engines/wintermute/base/gfx/base_renderer.h b/engines/wintermute/base/gfx/base_renderer.h
index e63ef8594f6..e912133d717 100644
--- a/engines/wintermute/base/gfx/base_renderer.h
+++ b/engines/wintermute/base/gfx/base_renderer.h
@@ -87,6 +87,8 @@ public:
 	 */
 	virtual bool fadeToColor(byte r, byte g, byte b, byte a) = 0;
 
+	virtual bool drawLine(int x1, int y1, int x2, int y2, uint32 color);
+	virtual bool drawRect(int x1, int y1, int x2, int y2, uint32 color, int width = 1);
 	virtual bool fillRect(int x, int y, int w, int h, uint32 color); // Unused outside indicator-display
 	BaseRenderer(BaseGame *inGame = nullptr);
 	~BaseRenderer() override;
diff --git a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
index f16468e0150..012ae45c0b2 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
@@ -539,6 +539,44 @@ bool BaseRenderOpenGL3D::setProjection() {
 	return setProjectionTransform(matProj);
 }
 
+bool BaseRenderOpenGL3D::drawLine(int x1, int y1, int x2, int y2, uint32 color) {
+	setupLines();
+
+	x1 += _drawOffsetX;
+	x2 += _drawOffsetX;
+	y1 += _drawOffsetY;
+	y2 += _drawOffsetY;
+
+	// position coords
+	RectangleVertex vertices[2];
+	vertices[0].x = x1;
+	vertices[0].y = y1;
+	vertices[0].z = 0.9f;
+	vertices[1].x = x2;
+	vertices[1].y = y2;
+	vertices[1].z = 0.9f;
+
+	byte a = RGBCOLGetA(color);
+	byte r = RGBCOLGetR(color);
+	byte g = RGBCOLGetG(color);
+	byte b = RGBCOLGetB(color);
+
+	glViewport(0, 0, _width, _height);
+	setProjection2D();
+
+	glColor4ub(r, g, b, a);
+
+	glEnableClientState(GL_VERTEX_ARRAY);
+
+	glVertexPointer(3, GL_FLOAT, sizeof(RectangleVertex), &vertices[0].x);
+
+	glDrawArrays(GL_LINES, 0, 2);
+
+	glDisableClientState(GL_VERTEX_ARRAY);
+
+	return true;
+}
+
 bool BaseRenderOpenGL3D::fillRect(int x, int y, int w, int h, uint32 color) {
 	setupLines();
 
diff --git a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.h b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.h
index b2f12a31352..ad2031653c9 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.h
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.h
@@ -103,6 +103,7 @@ public:
 	bool clear() override;
 
 	bool setViewport(int left, int top, int right, int bottom) override;
+	bool drawLine(int x1, int y1, int x2, int y2, uint32 color) override;
 	bool fillRect(int x, int y, int w, int h, uint32 color) override;
 
 	DXMatrix *buildMatrix(DXMatrix* out, const DXVector2 *centre, const DXVector2 *scaling, float angle);
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 5c2f9a58188..4ef5c58d315 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
@@ -625,6 +625,51 @@ bool BaseRenderOpenGL3DShader::setProjection() {
 	return setProjectionTransform(matProj);
 }
 
+bool BaseRenderOpenGL3DShader::drawLine(int x1, int y1, int x2, int y2, uint32 color) {
+	setupLines();
+	
+	x1 += _drawOffsetX;
+	x2 += _drawOffsetX;
+	y1 += _drawOffsetY;
+	y2 += _drawOffsetY;
+
+	// position coords
+	RectangleVertex vertices[2];
+	vertices[0].x = x1;
+	vertices[0].y = y1;
+	vertices[0].z = 0.9f;
+	vertices[1].x = x2;
+	vertices[1].y = y2;
+	vertices[1].z = 0.9f;
+
+	glBindBuffer(GL_ARRAY_BUFFER, _rectangleVBO);
+
+	glBufferSubData(GL_ARRAY_BUFFER, 0, 2 * sizeof(RectangleVertex), vertices);
+
+	byte a = RGBCOLGetA(color);
+	byte r = RGBCOLGetR(color);
+	byte g = RGBCOLGetG(color);
+	byte b = RGBCOLGetB(color);
+
+	Math::Vector4d colorValue;
+	colorValue.x() = r / 255.0f;
+	colorValue.y() = g / 255.0f;
+	colorValue.z() = b / 255.0f;
+	colorValue.w() = a / 255.0f;
+
+	_lineShader->use();
+	_lineShader->setUniform("color", colorValue);
+
+	glViewport(0, 0, _width, _height);
+
+	setProjection2D(_lineShader);
+
+	glDrawArrays(GL_LINES, 0, 2);
+
+	glBindBuffer(GL_ARRAY_BUFFER, 0);
+	return true;
+}
+
 bool BaseRenderOpenGL3DShader::fillRect(int x, int y, int w, int h, uint32 color) {
 	setupLines();
 
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 20aed511443..e1631ef2c3e 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h
@@ -104,6 +104,7 @@ public:
 	bool clear() override;
 
 	bool setViewport(int left, int top, int right, int bottom) override;
+	bool drawLine(int x1, int y1, int x2, int y2, uint32 color) override;
 	bool fillRect(int x, int y, int w, int h, uint32 color) override;
 
 	DXMatrix *buildMatrix(DXMatrix* out, const DXVector2 *centre, const DXVector2 *scaling, float angle);
diff --git a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
index c2f2c896053..e94554a2eb8 100644
--- a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
+++ b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
@@ -448,6 +448,28 @@ void BaseRenderOSystem::drawFromSurface(RenderTicket *ticket, Common::Rect *dstR
 	ticket->drawToSurface(_renderSurface, dstRect, clipRect);
 }
 
+//////////////////////////////////////////////////////////////////////////
+bool BaseRenderOSystem::drawLine(int x1, int y1, int x2, int y2, uint32 color) {
+	byte r = RGBCOLGetR(color);
+	byte g = RGBCOLGetG(color);
+	byte b = RGBCOLGetB(color);
+	byte a = RGBCOLGetA(color);
+
+	Common::Point32 point1, point2;
+	point1.x = x1;
+	point1.y = y1;
+	pointToScreen(&point1);
+
+	point2.x = x2;
+	point2.y = y2;
+	pointToScreen(&point2);
+
+	// TODO
+	//uint32 colorVal = _renderSurface->format.ARGBToColor(a, r, g, b);
+	//_renderSurface->drawLine(point1.x, point1.y, point2.x + 1, point2.y + 1, colorVal);
+	return STATUS_OK;
+}
+
 //////////////////////////////////////////////////////////////////////////
 bool BaseRenderOSystem::fillRect(int x, int y, int w, int h, uint32 color) {
 	// This function isn't used outside of indicator-displaying, and thus quite unused in
@@ -461,8 +483,6 @@ bool BaseRenderOSystem::fillRect(int x, int y, int w, int h, uint32 color) {
 	byte b = RGBCOLGetB(color);
 	byte a = RGBCOLGetA(color);
 
-	//SDL_SetRenderDrawBlendMode(_renderer, SDL_BLENDMODE_BLEND);
-
 	Common::Rect fillRect(x, y, x + w, y + w);
 	modTargetRect(&fillRect);
 
diff --git a/engines/wintermute/base/gfx/osystem/base_render_osystem.h b/engines/wintermute/base/gfx/osystem/base_render_osystem.h
index 406e4684c67..be98fceb9f7 100644
--- a/engines/wintermute/base/gfx/osystem/base_render_osystem.h
+++ b/engines/wintermute/base/gfx/osystem/base_render_osystem.h
@@ -76,6 +76,7 @@ public:
 	bool fade(uint16 alpha) override;
 	bool fadeToColor(byte r, byte g, byte b, byte a) override;
 
+	bool drawLine(int x1, int y1, int x2, int y2, uint32 color) override;
 	bool fillRect(int x, int y, int w, int h, uint32 color) override;
 
 	BaseImage *takeScreenshot(int newWidth = 0, int newHeight = 0) override;




More information about the Scummvm-git-logs mailing list