[Scummvm-git-logs] scummvm master -> 22a98d80f466b96a3b14d4a821291cebe01e2eda

mduggan noreply at scummvm.org
Mon Jan 30 07:22:55 UTC 2023


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

Summary:
c5ebc0a8ad TETRAEDGE: Don't allow quickload direct from main menu
001e4f4e8a TETRAEDGE: Clean up shadow rendering a little
4d3337b5db TETRAEDGE: Implement clipping for long dialog
fad5cac0c0 TETRAEDGE: Work around artifacts on text rendering
057da99725 TETRAEDGE: Fix addAnchorZone to actually add the zone
e7cac97877 TETRAEDGE: Fix many small issues identified by Coverity
22a98d80f4 TETRAEDGE: Fix font anti-aliasing result slightly


Commit: c5ebc0a8adb3fd57cc8a354e4d604d757e9c5be1
    https://github.com/scummvm/scummvm/commit/c5ebc0a8adb3fd57cc8a354e4d604d757e9c5be1
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2023-01-30T13:24:09+09:00

Commit Message:
TETRAEDGE: Don't allow quickload direct from main menu

Changed paths:
    engines/tetraedge/game/main_menu.h
    engines/tetraedge/tetraedge.cpp
    engines/tetraedge/tetraedge.h


diff --git a/engines/tetraedge/game/main_menu.h b/engines/tetraedge/game/main_menu.h
index 81708ecfe89..d2566696c07 100644
--- a/engines/tetraedge/game/main_menu.h
+++ b/engines/tetraedge/game/main_menu.h
@@ -63,6 +63,7 @@ public:
 
 	void refresh();
 	void setCenterButtonsVisibility(bool visible);
+	bool isEntered() const { return _entered; }
 
 private:
 
diff --git a/engines/tetraedge/tetraedge.cpp b/engines/tetraedge/tetraedge.cpp
index 7565ba429aa..da30680072b 100644
--- a/engines/tetraedge/tetraedge.cpp
+++ b/engines/tetraedge/tetraedge.cpp
@@ -132,6 +132,10 @@ Common::String TetraedgeEngine::getGameId() const {
 	return _gameDescription->gameId;
 }
 
+bool TetraedgeEngine::canLoadGameStateCurrently() {
+	return _game && _application && !_application->mainMenu().isEntered();
+}
+
 bool TetraedgeEngine::canSaveGameStateCurrently() {
 	return canSaveAutosaveCurrently() && !_application->isLockCursor();
 }
diff --git a/engines/tetraedge/tetraedge.h b/engines/tetraedge/tetraedge.h
index e97739a411c..6daa7d1f1ad 100644
--- a/engines/tetraedge/tetraedge.h
+++ b/engines/tetraedge/tetraedge.h
@@ -91,10 +91,7 @@ public:
 			(f == kSupportsReturnToLauncher);
 	};
 
-	bool canLoadGameStateCurrently() override {
-		return true;
-	}
-
+	bool canLoadGameStateCurrently() override;
 	bool canSaveGameStateCurrently() override;
 	bool canSaveAutosaveCurrently() override;
 


Commit: 001e4f4e8a35daf2fd89aa344649af47a7018037
    https://github.com/scummvm/scummvm/commit/001e4f4e8a35daf2fd89aa344649af47a7018037
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2023-01-30T13:24:09+09:00

Commit Message:
TETRAEDGE: Clean up shadow rendering a little

It's still broken, but code is easier to understand now.

Changed paths:
    engines/tetraedge/game/characters_shadow.cpp
    engines/tetraedge/game/characters_shadow_opengl.cpp
    engines/tetraedge/game/characters_shadow_tinygl.cpp
    engines/tetraedge/game/in_game_scene.cpp
    engines/tetraedge/game/scene_lights_xml_parser.cpp
    engines/tetraedge/te/te_material.cpp
    engines/tetraedge/te/te_material.h
    engines/tetraedge/te/te_mesh.cpp
    engines/tetraedge/te/te_renderer_opengl.cpp
    engines/tetraedge/te/te_renderer_tinygl.cpp


diff --git a/engines/tetraedge/game/characters_shadow.cpp b/engines/tetraedge/game/characters_shadow.cpp
index c982e3cb4e0..14be1f105c4 100644
--- a/engines/tetraedge/game/characters_shadow.cpp
+++ b/engines/tetraedge/game/characters_shadow.cpp
@@ -58,15 +58,15 @@ void CharactersShadow::createTexture(InGameScene *scene) {
 	renderer->enableTexture();
 	TeLight *light = scene->shadowLight();
 	if (light) {
-		TeQuaternion q1 = TeQuaternion::fromAxisAndAngle(TeVector3f32(0, 1, 0), light->positionRadial().getX() - M_PI_2);
-		TeQuaternion q2 = TeQuaternion::fromAxisAndAngle(TeVector3f32(1, 0, 0), light->positionRadial().getY());
+		const TeQuaternion q1 = TeQuaternion::fromAxisAndAngle(TeVector3f32(0, 1, 0), light->positionRadial().getX() - M_PI_2);
+		const TeQuaternion q2 = TeQuaternion::fromAxisAndAngle(TeVector3f32(1, 0, 0), light->positionRadial().getY());
 		_camera->setRotation(q2 * q1);
 		_camera->setPosition(light->position3d());
 	}
 	_camera->setFov((float)(scene->shadowFov() * M_PI / 180.0));
 	_camera->setOrthoPlanes(scene->shadowNearPlane(), scene->shadowFarPlane());
 	_camera->apply();
-	
+
 	createTextureInternal(scene);
 
 	TeCamera::restore();
diff --git a/engines/tetraedge/game/characters_shadow_opengl.cpp b/engines/tetraedge/game/characters_shadow_opengl.cpp
index ccba697b9fe..d118f49bebd 100644
--- a/engines/tetraedge/game/characters_shadow_opengl.cpp
+++ b/engines/tetraedge/game/characters_shadow_opengl.cpp
@@ -28,6 +28,13 @@
 #include "tetraedge/te/te_renderer.h"
 #include "tetraedge/te/te_3d_texture_opengl.h"
 
+//#define TETRAEDGE_DUMP_SHADOW_RENDER 1
+
+#ifdef TETRAEDGE_DUMP_SHADOW_RENDER
+#include "image/png.h"
+static int dumpCount = 0;
+#endif
+
 namespace Tetraedge {
 
 void CharactersShadowOpenGL::createInternal() {
@@ -54,6 +61,19 @@ void CharactersShadowOpenGL::createTextureInternal(InGameScene *scene) {
 	glBindTexture(GL_TEXTURE_2D, _glTex);
 	glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, _texSize, _texSize);
 	renderer->clearBuffer(TeRenderer::ColorAndDepth);
+
+#ifdef TETRAEDGE_DUMP_SHADOW_RENDER
+	Graphics::Surface tex;
+	tex.create(_texSize, _texSize, Graphics::PixelFormat(4, 8, 8, 8, 8, 0, 8, 16, 24));
+	glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, tex.getPixels());
+	Common::DumpFile dumpFile;
+	tex.flipVertical(Common::Rect(tex.w, tex.h));
+	dumpFile.open(Common::String::format("/tmp/rendered-shadow-dump-%04d.png", dumpCount));
+	dumpCount++;
+	Image::writePNG(dumpFile, tex);
+	tex.free();
+	dumpFile.close();
+#endif
 }
 
 void CharactersShadowOpenGL::deleteTexture() {
@@ -118,7 +138,7 @@ void CharactersShadowOpenGL::draw(InGameScene *scene) {
 	for (TeIntrusivePtr<TeModel> model : scene->zoneModels()) {
 		if (model->meshes().size() > 0 && model->meshes()[0]->materials().empty()) {
 			model->meshes()[0]->defaultMaterial(TeIntrusivePtr<Te3DTexture>());
-			model->meshes()[0]->materials()[0]._enableSomethingDefault0 = true;
+			model->meshes()[0]->materials()[0]._isShadowTexture = true;
 			model->meshes()[0]->materials()[0]._diffuseColor = scene->shadowColor();
 		}
 		model->draw();
diff --git a/engines/tetraedge/game/characters_shadow_tinygl.cpp b/engines/tetraedge/game/characters_shadow_tinygl.cpp
index 278a205c8a4..12c9463eebd 100644
--- a/engines/tetraedge/game/characters_shadow_tinygl.cpp
+++ b/engines/tetraedge/game/characters_shadow_tinygl.cpp
@@ -123,7 +123,7 @@ void CharactersShadowTinyGL::draw(InGameScene *scene) {
 	for (TeIntrusivePtr<TeModel> model : scene->zoneModels()) {
 		if (model->meshes().size() > 0 && model->meshes()[0]->materials().empty()) {
 			model->meshes()[0]->defaultMaterial(TeIntrusivePtr<Te3DTexture>());
-			model->meshes()[0]->materials()[0]._enableSomethingDefault0 = true;
+			model->meshes()[0]->materials()[0]._isShadowTexture = true;
 			model->meshes()[0]->materials()[0]._diffuseColor = scene->shadowColor();
 		}
 		model->draw();
diff --git a/engines/tetraedge/game/in_game_scene.cpp b/engines/tetraedge/game/in_game_scene.cpp
index 46816da1153..8bd7d2a5f60 100644
--- a/engines/tetraedge/game/in_game_scene.cpp
+++ b/engines/tetraedge/game/in_game_scene.cpp
@@ -226,12 +226,13 @@ void InGameScene::convertPathToMesh(TeFreeMoveZone *zone) {
 	model->setPosition(zone->position());
 	model->setRotation(zone->rotation());
 	model->setScale(zone->scale());
-	unsigned long nverticies = zone->verticies().size();
-	model->meshes()[0]->setConf(nverticies, nverticies, TeMesh::MeshMode_Triangles, 0, 0);
+	unsigned long nverticies = zone->freeMoveZoneVerticies().size();
+	TeMesh *mesh0 = model->meshes()[0].get();
+	mesh0->setConf(nverticies, nverticies, TeMesh::MeshMode_Triangles, 0, 0);
 	for (uint i = 0; i < nverticies; i++) {
-		model->meshes()[0]->setIndex(i, i);
-		model->meshes()[0]->setVertex(i, zone->verticies()[i]);
-		model->meshes()[0]->setNormal(i, TeVector3f32(0, 0, 1));
+		mesh0->setIndex(i, i);
+		mesh0->setVertex(i, zone->freeMoveZoneVerticies()[i]);
+		mesh0->setNormal(i, TeVector3f32(0, 0, 1));
 	}
 	_zoneModels.push_back(model);
 }
diff --git a/engines/tetraedge/game/scene_lights_xml_parser.cpp b/engines/tetraedge/game/scene_lights_xml_parser.cpp
index c5fb3727518..34cce550195 100644
--- a/engines/tetraedge/game/scene_lights_xml_parser.cpp
+++ b/engines/tetraedge/game/scene_lights_xml_parser.cpp
@@ -150,7 +150,8 @@ bool SceneLightsXmlParser::parserCallback_Shadow(ParserNode *node) {
 }
 
 bool SceneLightsXmlParser::parserCallback_SourceLight(ParserNode *node) {
-	_shadowLightNo = atof(node->values["number"].c_str());
+	// Note: must be signed, -1 to disable shadows.
+	_shadowLightNo = atoi(node->values["number"].c_str());
 	return true;
 }
 
diff --git a/engines/tetraedge/te/te_material.cpp b/engines/tetraedge/te/te_material.cpp
index c01ca0f6839..8a6a27e7207 100644
--- a/engines/tetraedge/te/te_material.cpp
+++ b/engines/tetraedge/te/te_material.cpp
@@ -48,7 +48,7 @@ void TeMaterial::defaultValues() {
 	_emissionColor = TeColor(0, 0, 0, 255);
 	_shininess = 0.0;
 	_enableLights = false;
-	_enableSomethingDefault0 = false;
+	_isShadowTexture = false;
 }
 
 Common::String TeMaterial::dump() const {
@@ -83,7 +83,7 @@ TeMaterial &TeMaterial::operator=(const TeMaterial &other) {
 	_shininess = other._shininess;
 	_mode = other._mode;
 	_enableLights = other._enableLights;
-	_enableSomethingDefault0 = other._enableSomethingDefault0;
+	_isShadowTexture = other._isShadowTexture;
 
 	return *this;
 }
diff --git a/engines/tetraedge/te/te_material.h b/engines/tetraedge/te/te_material.h
index 2fd060abbc3..1e8fab6b365 100644
--- a/engines/tetraedge/te/te_material.h
+++ b/engines/tetraedge/te/te_material.h
@@ -64,7 +64,7 @@ public:
 	TeColor _specularColor;
 	TeColor _emissionColor;
 	float _shininess;
-	bool _enableSomethingDefault0;
+	bool _isShadowTexture;
 	bool _enableLights;
 };
 
diff --git a/engines/tetraedge/te/te_mesh.cpp b/engines/tetraedge/te/te_mesh.cpp
index 106e7617342..42ee76e2a5f 100644
--- a/engines/tetraedge/te/te_mesh.cpp
+++ b/engines/tetraedge/te/te_mesh.cpp
@@ -72,7 +72,7 @@ bool TeMesh::hasAlpha(uint idx) {
 	bool retval = hasGlobalAlpha;
 	if (idx < _materials.size()) {
 		const TeMaterial &material = _materials[idx];
-		if (material._enableSomethingDefault0) {
+		if (material._isShadowTexture) {
 			retval = false;
 		} else {
 			retval = true;
@@ -157,7 +157,7 @@ void TeMesh::attachMaterial(uint idx, const TeMaterial &src) {
 	TeMaterial &dest = _materials[idx];
 	dest._texture = src._texture;
 	dest._enableLights = src._enableLights;
-	dest._enableSomethingDefault0 = src._enableSomethingDefault0;
+	dest._isShadowTexture = src._isShadowTexture;
 	dest._emissionColor = src._emissionColor;
 	dest._shininess = src._shininess;
 	dest._diffuseColor = src._diffuseColor;
diff --git a/engines/tetraedge/te/te_renderer_opengl.cpp b/engines/tetraedge/te/te_renderer_opengl.cpp
index de72dfc3061..95ee7c8d6bb 100644
--- a/engines/tetraedge/te/te_renderer_opengl.cpp
+++ b/engines/tetraedge/te/te_renderer_opengl.cpp
@@ -184,7 +184,7 @@ void TeRendererOpenGL::renderTransparentMeshes() {
 			glEnable(GL_TEXTURE_2D);
 			_textureEnabled = true;
 		}
-		if (material._enableSomethingDefault0) {
+		if (material._isShadowTexture) {
 			glDisableClientState(GL_TEXTURE_COORD_ARRAY);
 			glDisableClientState(GL_COLOR_ARRAY);
 		}
@@ -207,7 +207,7 @@ void TeRendererOpenGL::renderTransparentMeshes() {
 
 		vertsDrawn += meshProperties._vertexCount;
 
-		if (material._enableSomethingDefault0) {
+		if (material._isShadowTexture) {
 			glEnableClientState(GL_TEXTURE_COORD_ARRAY);
 			glEnableClientState(GL_COLOR_ARRAY);
 		}
@@ -299,7 +299,7 @@ void TeRendererOpenGL::shadowMode(enum ShadowMode mode) {
 void TeRendererOpenGL::applyMaterial(const TeMaterial &m) {
 	//debug("TeMaterial::apply (%s)", dump().c_str());
 	static const float constColor[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
-	if (_shadowMode == TeRenderer::ShadowModeNone) {
+	if (_shadowMode == ShadowModeNone) {
 		if (m._enableLights)
 			TeLightOpenGL::enableAll();
 		else
@@ -347,10 +347,10 @@ void TeRendererOpenGL::applyMaterial(const TeMaterial &m) {
 		glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diffuse);
 
 		setCurrentColor(m._diffuseColor);
-	} else if (_shadowMode == TeRenderer::ShadowModeCreating) {
-		// NOTE: Diverge from original here, it sets 255.0 but the
-		// colors should be scaled -1.0 .. 1.0.
-		static const float fullColor[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
+	} else if (_shadowMode == ShadowModeCreating) {
+		// NOTE: Replicate seeming bug from original here, it sets 255.0 but the
+		// colors should be scaled -1.0 .. 1.0?
+		static const float fullColor[4] = { 255.0f, 255.0f, 255.0f, 255.0f };
 		TeLightOpenGL::disableAll();
 		glDisable(GL_ALPHA_TEST);
 		glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
@@ -360,8 +360,7 @@ void TeRendererOpenGL::applyMaterial(const TeMaterial &m) {
 		glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, fullColor);
 	}
 
-	// TODO: Work out what TeMaterial::_enableSomethingDefault0 actually is.
-	if (!m._enableSomethingDefault0) {
+	if (!m._isShadowTexture) {
 		glDisable(GL_TEXTURE_GEN_S);
 		glDisable(GL_TEXTURE_GEN_T);
 		glDisable(GL_TEXTURE_GEN_R);
diff --git a/engines/tetraedge/te/te_renderer_tinygl.cpp b/engines/tetraedge/te/te_renderer_tinygl.cpp
index 7ab22a9aba2..6e666a4455c 100644
--- a/engines/tetraedge/te/te_renderer_tinygl.cpp
+++ b/engines/tetraedge/te/te_renderer_tinygl.cpp
@@ -190,7 +190,7 @@ void TeRendererTinyGL::renderTransparentMeshes() {
 			tglEnable(TGL_TEXTURE_2D);
 			_textureEnabled = true;
 		}
-		if (material._enableSomethingDefault0) {
+		if (material._isShadowTexture) {
 			tglDisableClientState(TGL_TEXTURE_COORD_ARRAY);
 			tglDisableClientState(TGL_COLOR_ARRAY);
 		}
@@ -216,7 +216,7 @@ void TeRendererTinyGL::renderTransparentMeshes() {
 
 		vertsDrawn += meshProperties._vertexCount;
 
-		if (material._enableSomethingDefault0) {
+		if (material._isShadowTexture) {
 			tglEnableClientState(TGL_TEXTURE_COORD_ARRAY);
 			tglEnableClientState(TGL_COLOR_ARRAY);
 		}
@@ -374,8 +374,7 @@ void TeRendererTinyGL::applyMaterial(const TeMaterial &m) {
 		tglMaterialfv(TGL_FRONT_AND_BACK, TGL_EMISSION, fullColor);
 	}
 
-	//warning("TODO: Work out what TeMaterial::_enableSomethingDefault0 actually is.");
-	if (!m._enableSomethingDefault0) {
+	if (!m._isShadowTexture) {
 		tglDisable(TGL_TEXTURE_GEN_S);
 		tglDisable(TGL_TEXTURE_GEN_T);
 		tglDisable(TGL_TEXTURE_GEN_R);


Commit: 4d3337b5db3eef213170201a1dae07934d0894f9
    https://github.com/scummvm/scummvm/commit/4d3337b5db3eef213170201a1dae07934d0894f9
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2023-01-30T13:24:09+09:00

Commit Message:
TETRAEDGE: Implement clipping for long dialog

Changed paths:
    engines/tetraedge/te/te_clip_layout.cpp
    engines/tetraedge/te/te_clip_layout.h
    engines/tetraedge/te/te_extended_text_layout.h
    engines/tetraedge/te/te_free_move_zone.h
    engines/tetraedge/te/te_i_text_layout.h
    engines/tetraedge/te/te_lua_gui.cpp
    engines/tetraedge/te/te_text_base2.cpp
    engines/tetraedge/te/te_text_layout.h


diff --git a/engines/tetraedge/te/te_clip_layout.cpp b/engines/tetraedge/te/te_clip_layout.cpp
index c3bb6ee8454..a86e6b80efb 100644
--- a/engines/tetraedge/te/te_clip_layout.cpp
+++ b/engines/tetraedge/te/te_clip_layout.cpp
@@ -20,10 +20,46 @@
  */
 
 #include "tetraedge/te/te_clip_layout.h"
+#include "tetraedge/tetraedge.h"
+#include "tetraedge/game/application.h"
+#include "tetraedge/te/te_renderer.h"
 
 namespace Tetraedge {
 
 TeClipLayout::TeClipLayout() {
 }
 
+void TeClipLayout::draw() {
+	if (!worldVisible())
+		return;
+
+	TeRenderer *renderer = g_engine->getRenderer();
+	bool prevScissorEnabled = renderer->scissorEnabled();
+	const TeVector2f32 prevScissorPos(renderer->scissorX(), renderer->scissorY());
+	const TeVector2f32 prevScissorSize(renderer->scissorWidth(), renderer->scissorHeight());
+
+	const TeMatrix4x4 worldTransform = worldTransformationMatrix();
+
+	const TeVector3f32 v1 = worldTransform * TeVector3f32(0, 0, 0);
+	const TeVector3f32 v2 = worldTransform * TeVector3f32(1, 0, 0);
+	const TeVector3f32 v3 = worldTransform * TeVector3f32(0, 1, 0);
+
+	const TeVector3f32 offset((v2 - v1).length(), (v3 - v1).length(), 1);
+	const TeVector3f32 thisSize(xSize(), ySize(), 0);
+	const TeVector3f32 newScissorSize = thisSize * offset;
+	const TeVector3f32 transformedSize(v1.x() - newScissorSize.x() / 2, v1.y() + newScissorSize.y() / 2, 0);
+
+	const TeVector3f32 winSize = g_engine->getApplication()->getMainWindow().size();
+
+	const TeVector3f32 newScissorOff(transformedSize.x() + winSize.x() / 2, winSize.y() - (transformedSize.y() + winSize.y() / 2), 0);
+
+	renderer->setScissorEnabled(true);
+	renderer->setScissor(newScissorOff.x(), newScissorOff.y(), newScissorSize.x(), newScissorSize.y());
+
+	TeLayout::draw();
+
+	renderer->setScissor(prevScissorPos.getX(), prevScissorPos.getY(), prevScissorSize.getX(), prevScissorSize.getY());
+	renderer->setScissorEnabled(prevScissorEnabled);
+}
+
 } // end namespace Tetraedge
diff --git a/engines/tetraedge/te/te_clip_layout.h b/engines/tetraedge/te/te_clip_layout.h
index 3df4d741f80..e67225f04d6 100644
--- a/engines/tetraedge/te/te_clip_layout.h
+++ b/engines/tetraedge/te/te_clip_layout.h
@@ -31,6 +31,7 @@ class TeClipLayout : public TeLayout {
 public:
 	TeClipLayout();
 
+	virtual void draw() override;
 };
 
 } // end namespace Tetraedge
diff --git a/engines/tetraedge/te/te_extended_text_layout.h b/engines/tetraedge/te/te_extended_text_layout.h
index 82091ddf13c..9f2c23d03de 100644
--- a/engines/tetraedge/te/te_extended_text_layout.h
+++ b/engines/tetraedge/te/te_extended_text_layout.h
@@ -25,10 +25,11 @@
 #include "tetraedge/te/te_i_text_layout.h"
 #include "tetraedge/te/te_text_layout.h"
 #include "tetraedge/te/te_scrolling_layout.h"
+#include "tetraedge/te/te_clip_layout.h"
 
 namespace Tetraedge {
 
-class TeExtendedTextLayout : public TeITextLayout {
+class TeExtendedTextLayout : public TeClipLayout, public TeITextLayout {
 public:
 	TeExtendedTextLayout();
 
diff --git a/engines/tetraedge/te/te_free_move_zone.h b/engines/tetraedge/te/te_free_move_zone.h
index 45a96d1aeea..4f36d085541 100644
--- a/engines/tetraedge/te/te_free_move_zone.h
+++ b/engines/tetraedge/te/te_free_move_zone.h
@@ -114,6 +114,8 @@ public:
 	static TePickMesh2 *findNearestMesh(TeIntrusivePtr<TeCamera> &camera, const TeVector2s32 &frompt,
 			Common::Array<TePickMesh2*> &pickMeshes, TeVector3f32 *outloc, bool lastHitFirst);
 
+	const Common::Array<TeVector3f32> freeMoveZoneVerticies() const { return _freeMoveZoneVerticies; }
+
 private:
 	TeVector2s32 aStarResolution() const;
 
diff --git a/engines/tetraedge/te/te_i_text_layout.h b/engines/tetraedge/te/te_i_text_layout.h
index bdb987f150a..f311a8bff59 100644
--- a/engines/tetraedge/te/te_i_text_layout.h
+++ b/engines/tetraedge/te/te_i_text_layout.h
@@ -27,7 +27,7 @@
 
 namespace Tetraedge {
 
-class TeITextLayout : public TeLayout {
+class TeITextLayout {
 public:
 	TeITextLayout();
 
diff --git a/engines/tetraedge/te/te_lua_gui.cpp b/engines/tetraedge/te/te_lua_gui.cpp
index 84d30ee5c4a..1cf23fd67f3 100644
--- a/engines/tetraedge/te/te_lua_gui.cpp
+++ b/engines/tetraedge/te/te_lua_gui.cpp
@@ -79,7 +79,7 @@ TeLayout *TeLuaGUI::layout(const Common::String &name) {
 	if (layout)
 		return layout;
 
-	layout = textLayout(name);
+	layout = dynamic_cast<TeLayout *>(textLayout(name));
 	if (layout)
 		return layout;
 
diff --git a/engines/tetraedge/te/te_text_base2.cpp b/engines/tetraedge/te/te_text_base2.cpp
index a0eb1958be0..c970b24a9b3 100644
--- a/engines/tetraedge/te/te_text_base2.cpp
+++ b/engines/tetraedge/te/te_text_base2.cpp
@@ -112,6 +112,7 @@ void TeTextBase2::build() {
 	dumpFile.open(Common::String::format("/tmp/rendered-font-dump-%04d.png", dumpCount));
 	dumpCount++;
 	Image::writePNG(dumpFile, img);
+	dumpFile.close();
 #endif
 
 	_mesh->setConf(4, 4, TeMesh::MeshMode_TriangleStrip, 0, 0);
diff --git a/engines/tetraedge/te/te_text_layout.h b/engines/tetraedge/te/te_text_layout.h
index 0992dbc7676..3bb97622c7f 100644
--- a/engines/tetraedge/te/te_text_layout.h
+++ b/engines/tetraedge/te/te_text_layout.h
@@ -28,7 +28,7 @@
 
 namespace Tetraedge {
 
-class TeTextLayout : public TeITextLayout {
+class TeTextLayout : public TeITextLayout, public TeLayout {
 public:
 	TeTextLayout();
 


Commit: fad5cac0c01a62171f628311a5e68df59d90b68f
    https://github.com/scummvm/scummvm/commit/fad5cac0c01a62171f628311a5e68df59d90b68f
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2023-01-30T14:32:06+09:00

Commit Message:
TETRAEDGE: Work around artifacts on text rendering

Changed paths:
    engines/tetraedge/te/te_3d_texture_opengl.cpp
    engines/tetraedge/te/te_text_base2.cpp


diff --git a/engines/tetraedge/te/te_3d_texture_opengl.cpp b/engines/tetraedge/te/te_3d_texture_opengl.cpp
index 2d0f42bc848..efb352aa3c8 100644
--- a/engines/tetraedge/te/te_3d_texture_opengl.cpp
+++ b/engines/tetraedge/te/te_3d_texture_opengl.cpp
@@ -145,6 +145,15 @@ bool Te3DTextureOpenGL::load(const TeImage &img) {
 	} else if (_format == TeImage::RGBA8) {
 		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, _texWidth, _texHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
 		glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, img.w, img.h, GL_RGBA, GL_UNSIGNED_BYTE, imgdata);
+		// FIXME: Slight hack.. sometimes artifacts appear because we draw
+		// a (half?)pixel outside the original texture. Clear one more row
+		// of the new texture with 0s to avoid artifacts.
+		if ((int)_texHeight > img.h) {
+			byte *buf = new byte[img.w * 4];
+			memset(buf, 0, img.w * 4);
+			glTexSubImage2D(GL_TEXTURE_2D, 0, 0, img.h, img.w, 1, GL_RGBA, GL_UNSIGNED_BYTE, buf);
+			delete [] buf;
+		}
 	} else {
 		warning("Te3DTexture::load can't send image format %d to GL.", _format);
 	}
diff --git a/engines/tetraedge/te/te_text_base2.cpp b/engines/tetraedge/te/te_text_base2.cpp
index c970b24a9b3..61202b26e5b 100644
--- a/engines/tetraedge/te/te_text_base2.cpp
+++ b/engines/tetraedge/te/te_text_base2.cpp
@@ -98,7 +98,8 @@ void TeTextBase2::build() {
 	TeImage img;
 	Common::SharedPtr<TePalette> nullpal;
 	img.createImg(_size._x, _size._y, nullpal, TeImage::RGBA8);
-	img.fill(_globalColor.r(), _globalColor.g(), _globalColor.b(), 0);
+	// fill with transparent white, the global color is applied on the mesh.
+	img.fill(255, 255, 255, 0);
 
 	for (uint i = 0; i < _wrappedLines.size(); i++) {
 		drawLine(img, _wrappedLines[i], lineoffsets[i]);


Commit: 057da99725fb3b4884bc3f296a03efabcb0683d1
    https://github.com/scummvm/scummvm/commit/057da99725fb3b4884bc3f296a03efabcb0683d1
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2023-01-30T15:42:19+09:00

Commit Message:
TETRAEDGE: Fix addAnchorZone to actually add the zone

Changed paths:
    engines/tetraedge/game/in_game_scene.cpp


diff --git a/engines/tetraedge/game/in_game_scene.cpp b/engines/tetraedge/game/in_game_scene.cpp
index 8bd7d2a5f60..c49d220c05e 100644
--- a/engines/tetraedge/game/in_game_scene.cpp
+++ b/engines/tetraedge/game/in_game_scene.cpp
@@ -86,6 +86,7 @@ void InGameScene::addAnchorZone(const Common::String &s1, const Common::String &
 			zone->_loc = d._position;
 		}
 	}
+	_anchorZones.push_back(zone);
 }
 
 bool InGameScene::addMarker(const Common::String &markerName, const Common::String &imgPath, float x, float y, const Common::String &locType, const Common::String &markerVal) {
@@ -713,7 +714,7 @@ bool InGameScene::loadLights(const Common::Path &path) {
 	debug("Shadow: %s no:%d far:%.02f near:%.02f fov:%.02f", _shadowColor.dump().c_str(), _shadowLightNo, _shadowFarPlane, _shadowNearPlane, _shadowFov);
 	debug("Global: %s", TeLight::globalAmbient().dump().c_str());
 	for (uint i = 0; i < _lights.size(); i++) {
-		debug("%s", _lights[i].dump().c_str());
+		debug("%s", _lights[i]->dump().c_str());
 	}
 	debug("---  end lights  ---");
 #endif


Commit: e7cac97877351113ba4ce62c3f756224615ae453
    https://github.com/scummvm/scummvm/commit/e7cac97877351113ba4ce62c3f756224615ae453
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2023-01-30T16:11:29+09:00

Commit Message:
TETRAEDGE: Fix many small issues identified by Coverity

Changed paths:
    engines/tetraedge/game/bonus_menu.cpp
    engines/tetraedge/game/cellphone.cpp
    engines/tetraedge/game/character.cpp
    engines/tetraedge/game/confirm.cpp
    engines/tetraedge/game/credits.cpp
    engines/tetraedge/game/game.cpp
    engines/tetraedge/game/in_game_scene.cpp
    engines/tetraedge/game/inventory.cpp
    engines/tetraedge/game/lua_binds.cpp
    engines/tetraedge/game/objectif.cpp
    engines/tetraedge/game/owner_error_menu.cpp
    engines/tetraedge/te/te_3d_texture.cpp
    engines/tetraedge/te/te_act_zone.cpp
    engines/tetraedge/te/te_act_zone.h
    engines/tetraedge/te/te_camera.cpp
    engines/tetraedge/te/te_curve_anim2.h
    engines/tetraedge/te/te_free_move_zone.cpp
    engines/tetraedge/te/te_images_sequence.cpp
    engines/tetraedge/te/te_lua_gui.cpp
    engines/tetraedge/te/te_model_animation.cpp
    engines/tetraedge/te/te_renderer.cpp
    engines/tetraedge/te/te_renderer.h
    engines/tetraedge/te/te_timer.cpp


diff --git a/engines/tetraedge/game/bonus_menu.cpp b/engines/tetraedge/game/bonus_menu.cpp
index 0c13ca42362..1189b9ec624 100644
--- a/engines/tetraedge/game/bonus_menu.cpp
+++ b/engines/tetraedge/game/bonus_menu.cpp
@@ -30,7 +30,7 @@
 
 namespace Tetraedge {
 
-BonusMenu::BonusMenu() {
+BonusMenu::BonusMenu() : _pageNo(0) {
 }
 
 void BonusMenu::enter(const Common::String &scriptName) {
diff --git a/engines/tetraedge/game/cellphone.cpp b/engines/tetraedge/game/cellphone.cpp
index c49253d0297..076b9d9fc60 100644
--- a/engines/tetraedge/game/cellphone.cpp
+++ b/engines/tetraedge/game/cellphone.cpp
@@ -169,7 +169,7 @@ Common::Error Cellphone::syncState(Common::Serializer &s) {
 		if (!_addedNumbers.empty())
 			leave();
 
-		for (auto num : numbers)
+		for (const auto &num : numbers)
 			addNumber(num);
 	}
 	return Common::kNoError;
diff --git a/engines/tetraedge/game/character.cpp b/engines/tetraedge/game/character.cpp
index f57b8a3a1a2..62e2b0ef4b3 100644
--- a/engines/tetraedge/game/character.cpp
+++ b/engines/tetraedge/game/character.cpp
@@ -67,7 +67,9 @@ _stepSound1("sounds/SFX/PAS_H_BOIS1.ogg"), _stepSound2("sounds/SFX/PAS_H_BOIS2.o
 _freeMoveZone(nullptr), _animSoundOffset(0), _lastAnimFrame(0), _charLookingAt(nullptr),
 _recallageY(true), _walkToFlag(false), _walkCurveEnd(0.0f), _walkCurveLast(0.0f),
 _walkCurveLen(0.0f), _walkCurveIncrement(0.0f), _walkEndAnimG(false), _walkTotalFrames(0),
-_walkCurveNextLength(0.0f) {
+_walkCurveNextLength(0.0f), _walkedLength(0.0f), _walkLoopAnimLen(0.0f), _walkEndGAnimLen(0.0f),
+_walkStartAnimLen(0.0f), _walkStartAnimFrameCount(0), _walkLoopAnimFrameCount(0),
+_walkEndGAnimFrameCount(0), _hasAnchor(false) {
 	_curModelAnim.setDeleteFn(&TeModelAnimation::deleteLater);
 }
 
diff --git a/engines/tetraedge/game/confirm.cpp b/engines/tetraedge/game/confirm.cpp
index 399d349b336..2703c707b46 100644
--- a/engines/tetraedge/game/confirm.cpp
+++ b/engines/tetraedge/game/confirm.cpp
@@ -62,6 +62,9 @@ void Confirm::enter(const Common::String &guiPath, const Common::String &y) {
 		const Common::String *cancelButtonLoc = app->loc().value("cancelButton");
 
 		TeTextLayout *textTextLayout = dynamic_cast<TeTextLayout *>(textLayout->child(0));
+		if (!textTextLayout)
+			error("Expected text layout child.");
+
 		textTextLayout->setText(textAttributs + *app->loc().value(textTextLayout->name()));
 
 		if (!okButtonLoc || !cancelButtonLoc) {
diff --git a/engines/tetraedge/game/credits.cpp b/engines/tetraedge/game/credits.cpp
index ce784ad63be..d0631e05743 100644
--- a/engines/tetraedge/game/credits.cpp
+++ b/engines/tetraedge/game/credits.cpp
@@ -111,7 +111,7 @@ void Credits::enter(bool returnToOptions) {
 
 void Credits::leave() {
 	_curveAnim.stop();
-	for (auto anim : _gui.layoutPositionLinearAnimations()) {
+	for (auto &anim : _gui.layoutPositionLinearAnimations()) {
 		anim._value->stop();
 	}
 	if (_gui.loaded()) {
diff --git a/engines/tetraedge/game/game.cpp b/engines/tetraedge/game/game.cpp
index 7fb3e6b179d..6ade5c90938 100644
--- a/engines/tetraedge/game/game.cpp
+++ b/engines/tetraedge/game/game.cpp
@@ -52,7 +52,8 @@ _sceneCharacterVisibleFromLoad(false), _isCharacterWalking(false),
 _lastCharMoveMousePos(0.0f, 0.0f), _randomSoundFinished(false),
 _previousMousePos(-1, -1), _markersVisible(true), _saveRequested(false),
 _gameLoadState(0), _luaShowOwnerError(false), _score(0), _warped(false),
-_firstInventory(true), _randomSource("SyberiaGameRandom") {
+_firstInventory(true), _randomSource("SyberiaGameRandom"), _frameCounter(0),
+_warpFadeFlag(false), _dialogsTold(0) {
 	for (int i = 0; i < NUM_OBJECTS_TAKEN_IDS; i++) {
 		_objectsTakenBits[i] = false;
 	}
diff --git a/engines/tetraedge/game/in_game_scene.cpp b/engines/tetraedge/game/in_game_scene.cpp
index c49d220c05e..591692cfdc7 100644
--- a/engines/tetraedge/game/in_game_scene.cpp
+++ b/engines/tetraedge/game/in_game_scene.cpp
@@ -549,12 +549,12 @@ bool InGameScene::load(const Common::Path &path) {
 				error("Improbable number of actzones %d", count);
 			_actZones.resize(count);
 			for (uint i = 0; i < _actZones.size(); i++) {
-				_actZones[i].s1 = Te3DObject2::deserializeString(actzonefile);
-				_actZones[i].s2 = Te3DObject2::deserializeString(actzonefile);
+				_actZones[i]._s1 = Te3DObject2::deserializeString(actzonefile);
+				_actZones[i]._s2 = Te3DObject2::deserializeString(actzonefile);
 				for (int j = 0; j < 4; j++)
-					TeVector2f32::deserialize(actzonefile, _actZones[i].points[j]);
-				_actZones[i].flag1 = (actzonefile.readByte() != 0);
-				_actZones[i].flag2 = true;
+					TeVector2f32::deserialize(actzonefile, _actZones[i]._points[j]);
+				_actZones[i]._flag1 = (actzonefile.readByte() != 0);
+				_actZones[i]._flag2 = true;
 			}
 		}
 	}
@@ -862,7 +862,7 @@ void InGameScene::loadBackground(const Common::Path &path) {
 	bg->disableAutoZ();
 	bg->setZPosition(wincam->orthoNearPlane());
 
-	for (auto layoutEntry : _bgGui.spriteLayouts()) {
+	for (const auto &layoutEntry : _bgGui.spriteLayouts()) {
 		AnimObject *animobj = new AnimObject();
 		animobj->_name = layoutEntry._key;
 		animobj->_layout = layoutEntry._value;
diff --git a/engines/tetraedge/game/inventory.cpp b/engines/tetraedge/game/inventory.cpp
index 8e48c1b0b45..348ff58ad30 100644
--- a/engines/tetraedge/game/inventory.cpp
+++ b/engines/tetraedge/game/inventory.cpp
@@ -414,6 +414,8 @@ void Inventory::selectedObject(InventoryObject *obj) {
 		TeSpriteLayout *selection = _gui.spriteLayoutChecked("selectionSprite");
 		selection->setVisible(obj->worldVisible());
 		TeLayout *parentLayout = dynamic_cast<TeLayout *>(obj->parent());
+		if (!parentLayout)
+			error("Couldn't get parent of object");
 		TeVector3f32 pos = parentLayout->position();
 		pos.z() = selection->position().z();
 		selection->setPosition(pos);
diff --git a/engines/tetraedge/game/lua_binds.cpp b/engines/tetraedge/game/lua_binds.cpp
index 4b37235aa2d..47a696acbdb 100644
--- a/engines/tetraedge/game/lua_binds.cpp
+++ b/engines/tetraedge/game/lua_binds.cpp
@@ -834,7 +834,7 @@ static int tolua_ExportedFunctions_SetCharacterAnimationAndWaitForEnd00(lua_Stat
 static void BlendCharacterAnimation(const Common::String &charname, const Common::String &animname, float blendAmount, bool repeat, bool returnToIdle) {
 	Game *game = g_engine->getGame();
 	Character *c = game->scene().character(charname);
-	bool result = c->blendAnimation(animname, blendAmount, repeat, returnToIdle);
+	bool result = c && c->blendAnimation(animname, blendAmount, repeat, returnToIdle);
 	if (!result) {
 		warning("[BlendCharacterAnimation] Character's animation \"%s\" doesn't exist for the character\"%s\"  ",
 			animname.c_str(), charname.c_str());
diff --git a/engines/tetraedge/game/objectif.cpp b/engines/tetraedge/game/objectif.cpp
index 213c8e8ca3f..d80969af406 100644
--- a/engines/tetraedge/game/objectif.cpp
+++ b/engines/tetraedge/game/objectif.cpp
@@ -183,6 +183,8 @@ void Objectif::update() {
 		float z = 0.1f;
 		for (Te3DObject2 *child : tasks->childList()) {
 			TeTextLayout *text = dynamic_cast<TeTextLayout *>(child);
+			if (!text)
+				continue;
 			/*TeVector3f32 size =*/
 			text->size();
 			TeVector3f32 userPos = text->userPosition();
diff --git a/engines/tetraedge/game/owner_error_menu.cpp b/engines/tetraedge/game/owner_error_menu.cpp
index 4694698a4b5..f2adc7e179b 100644
--- a/engines/tetraedge/game/owner_error_menu.cpp
+++ b/engines/tetraedge/game/owner_error_menu.cpp
@@ -40,6 +40,8 @@ void OwnerErrorMenu::enter() {
 	TeLayout *menuLayout = layoutChecked("menu");
 	app->frontLayout().addChild(menuLayout);
 	TeTextLayout *txt = dynamic_cast<TeTextLayout*>(layoutChecked("ownerMenuText"));
+	if (!txt)
+		error("Couldn't get ownerMenuText layout");
 	const Common::String *locname = app->loc().value(txt->name());
 	txt->setText(value("textAttributs").toString() + (locname ? *locname : txt->name()));
 }
diff --git a/engines/tetraedge/te/te_3d_texture.cpp b/engines/tetraedge/te/te_3d_texture.cpp
index d033dd2526b..65b96d4f984 100644
--- a/engines/tetraedge/te/te_3d_texture.cpp
+++ b/engines/tetraedge/te/te_3d_texture.cpp
@@ -29,7 +29,9 @@
 namespace Tetraedge {
 
 Te3DTexture::Te3DTexture() : _createdTexture(false),
-_numFrames(1), _frameRate(0), _format(TeImage::INVALID) {
+_numFrames(1), _frameRate(0), _format(TeImage::INVALID), _loaded(false),
+_width(0), _height(0), _texHeight(0), _texWidth(0), _topBorder(0), _leftBorder(0),
+_rightBorder(0), _btmBorder(0), _flipY(false) {
 }
 
 Te3DTexture::~Te3DTexture() {
diff --git a/engines/tetraedge/te/te_act_zone.cpp b/engines/tetraedge/te/te_act_zone.cpp
index 092717f4441..c5cf6799fac 100644
--- a/engines/tetraedge/te/te_act_zone.cpp
+++ b/engines/tetraedge/te/te_act_zone.cpp
@@ -23,7 +23,7 @@
 
 namespace Tetraedge {
 
-TeActZone::TeActZone() {
+TeActZone::TeActZone() : _flag1(false), _flag2(false) {
 }
 
 } // end namespace Tetraedge
diff --git a/engines/tetraedge/te/te_act_zone.h b/engines/tetraedge/te/te_act_zone.h
index c3b1e427618..cb8e87eecb1 100644
--- a/engines/tetraedge/te/te_act_zone.h
+++ b/engines/tetraedge/te/te_act_zone.h
@@ -31,11 +31,11 @@ class TeActZone {
 public:
 	TeActZone();
 
-	Common::String s1;
-	Common::String s2;
-	TeVector2f32 points[4];
-	bool flag1;
-	bool flag2;
+	Common::String _s1;
+	Common::String _s2;
+	TeVector2f32 _points[4];
+	bool _flag1;
+	bool _flag2;
 
 private:
 
diff --git a/engines/tetraedge/te/te_camera.cpp b/engines/tetraedge/te/te_camera.cpp
index 4065f354ca9..13177cf3eb4 100644
--- a/engines/tetraedge/te/te_camera.cpp
+++ b/engines/tetraedge/te/te_camera.cpp
@@ -32,7 +32,8 @@ namespace Tetraedge {
 TeCamera::TeCamera() : _projectionMatrixType(0), _orthogonalParamL(0.0f),
 	_orthogonalParamR(1.0f), _orthogonalParamT(1.0f), _orthogonalParamB(0.0f),
 	_orthNearVal(10.0f), _orthFarVal(4000.0f), _transformA(0), /*_transformB(0),*/
-	_fov(40.0f), _somePerspectiveVal(1.0f)
+	_fov(40.0f), _somePerspectiveVal(1.0f), _viewportX(0), _viewportY(0), _viewportW(0),
+	_viewportH(0)
 {
 }
 
diff --git a/engines/tetraedge/te/te_curve_anim2.h b/engines/tetraedge/te/te_curve_anim2.h
index 7f9fd6e8a7e..c0ef1f1e512 100644
--- a/engines/tetraedge/te/te_curve_anim2.h
+++ b/engines/tetraedge/te/te_curve_anim2.h
@@ -37,7 +37,7 @@ class TeCurveAnim2 : public TeAnimation {
 public:
 	typedef void(T::*TMethod)(const S &);
 
-	TeCurveAnim2() {}
+	TeCurveAnim2() : _callbackObj(nullptr), _duration(0), _lastUpdateTime(0) {}
 	virtual ~TeCurveAnim2() {}
 
 	void setCurve(const Common::Array<float> &curve) {
diff --git a/engines/tetraedge/te/te_free_move_zone.cpp b/engines/tetraedge/te/te_free_move_zone.cpp
index a9dee0ddc7c..7051e06ed31 100644
--- a/engines/tetraedge/te/te_free_move_zone.cpp
+++ b/engines/tetraedge/te/te_free_move_zone.cpp
@@ -33,6 +33,9 @@ namespace Tetraedge {
 
 class TeFreeMoveZoneGraph : micropather::Graph {
 	friend class TeFreeMoveZone;
+
+	TeFreeMoveZoneGraph() : _owner(nullptr) {}
+
 	TeVector2s32 _size;
 	Common::Array<char> _flags;
 	float _bordersDistance;
diff --git a/engines/tetraedge/te/te_images_sequence.cpp b/engines/tetraedge/te/te_images_sequence.cpp
index ffe55b35745..b32e65ff915 100644
--- a/engines/tetraedge/te/te_images_sequence.cpp
+++ b/engines/tetraedge/te/te_images_sequence.cpp
@@ -28,7 +28,7 @@
 
 namespace Tetraedge {
 
-TeImagesSequence::TeImagesSequence() : _width(0), _height(0), _curFrame(0) {
+TeImagesSequence::TeImagesSequence() : _width(0), _height(0), _curFrame(0), _frameRate(0) {
 }
 
 TeImagesSequence::~TeImagesSequence() {
diff --git a/engines/tetraedge/te/te_lua_gui.cpp b/engines/tetraedge/te/te_lua_gui.cpp
index 1cf23fd67f3..0c61c3e01cd 100644
--- a/engines/tetraedge/te/te_lua_gui.cpp
+++ b/engines/tetraedge/te/te_lua_gui.cpp
@@ -27,7 +27,7 @@
 
 namespace Tetraedge {
 
-TeLuaGUI::TeLuaGUI() {
+TeLuaGUI::TeLuaGUI() : _loaded(false) {
 }
 
 TeButtonLayout *TeLuaGUI::buttonLayout(const Common::String &name) {
diff --git a/engines/tetraedge/te/te_model_animation.cpp b/engines/tetraedge/te/te_model_animation.cpp
index 7ab1f8bbc4a..23a60904fd6 100644
--- a/engines/tetraedge/te/te_model_animation.cpp
+++ b/engines/tetraedge/te/te_model_animation.cpp
@@ -33,7 +33,7 @@ namespace Tetraedge {
 
 TeModelAnimation::TeModelAnimation() : _firstFrame(-1), _lastFrame(SHRT_MAX),
 _curFrame(0), _curFrameValFresh(false), _repeatNum(0), _finishedSignalPending(false),
-_curFrame2(0), _useNMOArrays(0), _speed(0.0f) {
+_curFrame2(0), _useNMOArrays(0), _speed(0.0f), _numNMOFrames(0) {
 }
 
 int TeModelAnimation::calcCurrentFrame(double millis) {
diff --git a/engines/tetraedge/te/te_renderer.cpp b/engines/tetraedge/te/te_renderer.cpp
index 69f40ad8110..1e22dcb3ce2 100644
--- a/engines/tetraedge/te/te_renderer.cpp
+++ b/engines/tetraedge/te/te_renderer.cpp
@@ -33,7 +33,8 @@
 namespace Tetraedge {
 
 TeRenderer::TeRenderer() : _textureEnabled(false), _shadowMode(ShadowModeNone), _matrixMode(MM_GL_PROJECTION),
-_numTransparentMeshes(0), _pendingTransparentMeshProperties(0) {
+_numTransparentMeshes(0), _pendingTransparentMeshProperties(0), _currentCamera(nullptr), _scissorEnabled(false),
+_scissorX(0), _scissorY(0), _scissorWidth(0), _scissorHeight(0) {
 }
 
 void TeRenderer::addTransparentMesh(const TeMesh &mesh, unsigned long i1, unsigned long tricount, unsigned long materialno) {
diff --git a/engines/tetraedge/te/te_renderer.h b/engines/tetraedge/te/te_renderer.h
index 87cf89fd27f..691b4b381ab 100644
--- a/engines/tetraedge/te/te_renderer.h
+++ b/engines/tetraedge/te/te_renderer.h
@@ -49,7 +49,10 @@ public:
 
 	class TransparentMeshProperties {
 	public:
-		TransparentMeshProperties() : _camera(nullptr), _vertexCount(0), _shouldDraw(false), _scissorEnabled(false), _hasColor(false) {}
+		TransparentMeshProperties() : _camera(nullptr), _vertexCount(0), _shouldDraw(false),
+			_scissorEnabled(false), _hasColor(false), _glTexEnvMode(0), _zOrder(0.0f),
+			_sourceTransparentMesh(0), _scissorX(0), _scissorY(0),
+			_scissorWidth(0), _scissorHeight(0) {}
 
 		TeCamera *_camera;
 		int _vertexCount;
diff --git a/engines/tetraedge/te/te_timer.cpp b/engines/tetraedge/te/te_timer.cpp
index ea02846a2a8..d217a4b7b9d 100644
--- a/engines/tetraedge/te/te_timer.cpp
+++ b/engines/tetraedge/te/te_timer.cpp
@@ -32,7 +32,8 @@ namespace Tetraedge {
 
 
 TeTimer::TeTimer() : _stopped(true), _pausable(true), _alarmTime(0),
-_startTime(0), _lastTimeElapsed(0), _startTimeOffset(0), _updated(false) {
+_startTime(0), _lastTimeElapsed(0), _startTimeOffset(0), _updated(false),
+_alarmSet(false) {
 	if (realTimer()->isPaused()) {
 		realTimer()->start();
 		_realTime = realTimer()->getTimeFromStart();


Commit: 22a98d80f466b96a3b14d4a821291cebe01e2eda
    https://github.com/scummvm/scummvm/commit/22a98d80f466b96a3b14d4a821291cebe01e2eda
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2023-01-30T16:18:01+09:00

Commit Message:
TETRAEDGE: Fix font anti-aliasing result slightly

Changed paths:
    engines/tetraedge/te/te_text_base2.cpp


diff --git a/engines/tetraedge/te/te_text_base2.cpp b/engines/tetraedge/te/te_text_base2.cpp
index 61202b26e5b..ccd5d8972a6 100644
--- a/engines/tetraedge/te/te_text_base2.cpp
+++ b/engines/tetraedge/te/te_text_base2.cpp
@@ -98,8 +98,9 @@ void TeTextBase2::build() {
 	TeImage img;
 	Common::SharedPtr<TePalette> nullpal;
 	img.createImg(_size._x, _size._y, nullpal, TeImage::RGBA8);
-	// fill with transparent white, the global color is applied on the mesh.
-	img.fill(255, 255, 255, 0);
+	// fill with global color, alpha 0 so that the font anti-aliasing blends
+	// to the right color (see eg, the cellphone display)
+	img.fill(_globalColor.r(), _globalColor.g(), _globalColor.b(), 0);
 
 	for (uint i = 0; i < _wrappedLines.size(); i++) {
 		drawLine(img, _wrappedLines[i], lineoffsets[i]);




More information about the Scummvm-git-logs mailing list