[Scummvm-git-logs] scummvm master -> 702f535557ff41ae39c499455a4e944d8e759105

neuromancer noreply at scummvm.org
Fri May 17 08:03:35 UTC 2024


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:
73468c43ad FREESCAPE: fixes for dark and improvements in the group handling
f2699fbbe2 FREESCAPE: initial implementation of the skybox in castle ega
702f535557 FREESCAPE: fixes for the tinyGL renderer


Commit: 73468c43ad233a3678820dbf8e9dd96963e6eecc
    https://github.com/scummvm/scummvm/commit/73468c43ad233a3678820dbf8e9dd96963e6eecc
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2024-05-17T10:04:32+02:00

Commit Message:
FREESCAPE: fixes for dark and improvements in the group handling

Changed paths:
    engines/freescape/games/dark/amiga.cpp
    engines/freescape/games/dark/atari.cpp
    engines/freescape/games/dark/cpc.cpp
    engines/freescape/games/dark/dark.cpp
    engines/freescape/games/dark/dos.cpp
    engines/freescape/games/palettes.cpp
    engines/freescape/loaders/8bitBinaryLoader.cpp
    engines/freescape/objects/group.cpp


diff --git a/engines/freescape/games/dark/amiga.cpp b/engines/freescape/games/dark/amiga.cpp
index 01c8b79a62b..13f192f6816 100644
--- a/engines/freescape/games/dark/amiga.cpp
+++ b/engines/freescape/games/dark/amiga.cpp
@@ -121,12 +121,6 @@ void DarkEngine::loadAssetsAmigaFullGame() {
 	loadPalettes(stream, 0x2e528);
 	loadGlobalObjects(stream, 0x30f0 - 50, 24);
 	loadMessagesVariableSize(stream, 0x3d37, 66);
-
-	for (auto &it : _areaMap) {
-		addWalls(it._value);
-		addECDs(it._value);
-		addSkanner(it._value);
-	}
 }
 
 void DarkEngine::drawAmigaAtariSTUI(Graphics::Surface *surface) {
diff --git a/engines/freescape/games/dark/atari.cpp b/engines/freescape/games/dark/atari.cpp
index 6bfd23ab78a..d9bfd8d1e0d 100644
--- a/engines/freescape/games/dark/atari.cpp
+++ b/engines/freescape/games/dark/atari.cpp
@@ -39,12 +39,6 @@ void DarkEngine::loadAssetsAtariFullGame() {
 	loadGlobalObjects(stream, 0x32f6, 24);
 	loadSoundsFx(stream, 0x266e8, 11);
 
-	for (auto &it : _areaMap) {
-		addWalls(it._value);
-		addECDs(it._value);
-		addSkanner(it._value);
-	}
-
 	GeometricObject *obj = nullptr;
 	obj = (GeometricObject *)_areaMap[15]->objectWithID(18);
 	assert(obj);
diff --git a/engines/freescape/games/dark/cpc.cpp b/engines/freescape/games/dark/cpc.cpp
index aad0a1930a6..d910283ec3f 100644
--- a/engines/freescape/games/dark/cpc.cpp
+++ b/engines/freescape/games/dark/cpc.cpp
@@ -65,11 +65,6 @@ void DarkEngine::loadAssetsCPCFullGame() {
 	loadFonts(&file, 0x60f3);
 	loadGlobalObjects(&file, 0x9a, 23);
 	load8bitBinary(&file, 0x6255, 16);
-	for (auto &it : _areaMap) {
-		addWalls(it._value);
-		addECDs(it._value);
-		addSkanner(it._value);
-	}
 	_indicators.push_back(loadBundledImage("dark_fallen_indicator"));
 	_indicators.push_back(loadBundledImage("dark_crouch_indicator"));
 	_indicators.push_back(loadBundledImage("dark_walk_indicator"));
diff --git a/engines/freescape/games/dark/dark.cpp b/engines/freescape/games/dark/dark.cpp
index f4aff0bc823..626e02d11d0 100644
--- a/engines/freescape/games/dark/dark.cpp
+++ b/engines/freescape/games/dark/dark.cpp
@@ -194,6 +194,13 @@ void DarkEngine::initGameState() {
 void DarkEngine::loadAssets() {
 	FreescapeEngine::loadAssets();
 
+	for (auto &it : _areaMap) {
+		addWalls(it._value);
+		addECDs(it._value);
+		if (it._value->getAreaID() != 255)
+			addSkanner(it._value);
+	}
+
 	_timeoutMessage = _messagesList[14];
 	_noShieldMessage = _messagesList[15];
 	_noEnergyMessage = _messagesList[16];
diff --git a/engines/freescape/games/dark/dos.cpp b/engines/freescape/games/dark/dos.cpp
index 84e9fb32445..046aa2649df 100644
--- a/engines/freescape/games/dark/dos.cpp
+++ b/engines/freescape/games/dark/dos.cpp
@@ -114,12 +114,6 @@ void DarkEngine::loadAssetsDOSDemo() {
 		_border = load8bitBinImage(&file, 0x210);
 		_border->setPalette((byte *)&kEGADefaultPalette, 0, 16);
 
-		for (auto &it : _areaMap) {
-			addWalls(it._value);
-			addECDs(it._value);
-			addSkanner(it._value);
-		}
-
 		_indicators.push_back(loadBundledImage("dark_fallen_indicator"));
 		_indicators.push_back(loadBundledImage("dark_crouch_indicator"));
 		_indicators.push_back(loadBundledImage("dark_walk_indicator"));
@@ -149,11 +143,6 @@ void DarkEngine::loadAssetsDOSDemo() {
 		_border = load8bitBinImage(&file, 0x210);
 		_border->setPalette((byte *)&kDarkCGAPalettePinkBlue, 0, 4);
 
-		for (auto &it : _areaMap) {
-			addWalls(it._value);
-			addECDs(it._value);
-			addSkanner(it._value);
-		}
 		swapPalette(1);
 	} else
 		error("Invalid or unsupported render mode %s for Dark Side", Common::getRenderModeDescription(_renderMode));
@@ -181,12 +170,6 @@ void DarkEngine::loadAssetsDOSFullGame() {
 		_border = load8bitBinImage(&file, 0x210);
 		_border->setPalette((byte *)&kEGADefaultPalette, 0, 16);
 
-		for (auto &it : _areaMap) {
-			addWalls(it._value);
-			addECDs(it._value);
-			addSkanner(it._value);
-		}
-
 		_indicators.push_back(loadBundledImage("dark_fallen_indicator"));
 		_indicators.push_back(loadBundledImage("dark_crouch_indicator"));
 		_indicators.push_back(loadBundledImage("dark_walk_indicator"));
@@ -215,11 +198,6 @@ void DarkEngine::loadAssetsDOSFullGame() {
 		_border = load8bitBinImage(&file, 0x210);
 		_border->setPalette((byte *)&kDarkCGAPalettePinkBlue, 0, 4);
 
-		for (auto &it : _areaMap) {
-			addWalls(it._value);
-			addECDs(it._value);
-			addSkanner(it._value);
-		}
 		swapPalette(1);
 	} else
 		error("Invalid or unsupported render mode %s for Dark Side", Common::getRenderModeDescription(_renderMode));
diff --git a/engines/freescape/games/palettes.cpp b/engines/freescape/games/palettes.cpp
index 6fc4cc75b6e..7f3d30cd395 100644
--- a/engines/freescape/games/palettes.cpp
+++ b/engines/freescape/games/palettes.cpp
@@ -165,7 +165,7 @@ void FreescapeEngine::loadPalettes(Common::SeekableReadStream *file, int offset)
 void FreescapeEngine::swapPalette(uint16 levelID) {
 	if (isAmiga() || isAtariST()) {
 		// The following palette was not available in the demo, so we select another one
-		if (isDemo() && levelID == 32)
+		if (isDriller() && isDemo() && levelID == 32)
 			levelID = 31;
 
 		_gfx->_palette = _paletteByArea[levelID];
diff --git a/engines/freescape/loaders/8bitBinaryLoader.cpp b/engines/freescape/loaders/8bitBinaryLoader.cpp
index 99a1f7cb253..e4b7e79f35c 100644
--- a/engines/freescape/loaders/8bitBinaryLoader.cpp
+++ b/engines/freescape/loaders/8bitBinaryLoader.cpp
@@ -406,15 +406,12 @@ Object *FreescapeEngine::load8bitObject(Common::SeekableReadStream *file) {
 		}
 		debugC(1, kFreescapeDebugParser, "End of object at %lx", long(file->pos()));
 
-		if (!GeometricObject::isPolygon(objectType))
-			position = 32 * position;
-
 		// create an object
 		return new GeometricObject(
 			objectType,
 			objectID,
 			rawFlagsAndType, // flags
-			position,
+			32 * position,
 			32 * v, // size
 			colours,
 			ecolours,
diff --git a/engines/freescape/objects/group.cpp b/engines/freescape/objects/group.cpp
index 0839edde65e..d326da5cf59 100644
--- a/engines/freescape/objects/group.cpp
+++ b/engines/freescape/objects/group.cpp
@@ -88,9 +88,12 @@ void Group::assemble(int index) {
 	GeometricObject *gobj = (GeometricObject *)_objects[index];
 	//gobj->makeVisible();
 	Math::Vector3d position = _operations[_step]->position;
-
+	Math::Vector3d offset = _origins[index] - _origins[0];
 	position = 32 * position / _scale;
-	gobj->offsetOrigin(position + _origins[index] - _origins[0]);
+
+	debugC(1, kFreescapeDebugCode, "Group %d: Assembling object %d originally at %f, %f, %f", _objectID, gobj->getObjectID(), gobj->getOrigin().x(), gobj->getOrigin().y(), gobj->getOrigin().z());
+	gobj->offsetOrigin(position + offset);
+	debugC(1, kFreescapeDebugCode, "Group %d: Assembling object %d originally at %f, %f, %f", _objectID, gobj->getObjectID(), gobj->getOrigin().x(), gobj->getOrigin().y(), gobj->getOrigin().z());
 }
 
 void Group::run() {
@@ -98,11 +101,11 @@ void Group::run() {
 		return;
 
 	int opcode = _operations[_step]->opcode;
+	debugC(1, kFreescapeDebugCode, "Executing opcode 0x%x at step %d", opcode, _step);
 	if (opcode == 0x80 || opcode == 0xff) {
-		_step = -1;
-		_active = false;
-		_finished = false;
+		reset();
 	} else if (opcode == 0x01) {
+		debugC(1, kFreescapeDebugCode, "Executing group condition %s", _operations[_step]->conditionSource.c_str());
 		g_freescape->executeCode(_operations[_step]->condition, false, true, false, false);
 	} else if (opcode == 0x6e) {
 		uint32 groupSize = _objects.size();
@@ -123,18 +126,18 @@ void Group::run() {
 }
 
 void Group::reset() {
-	/*_step = -1;
+	_step = -1;
 	_active = false;
 	_finished = false;
 	uint32 groupSize = _objects.size();
 	for (uint32 i = 0; i < groupSize ; i++) {
 		GeometricObject *gobj = (GeometricObject *)_objects[i];
 		if (GeometricObject::isPolygon(_objects[i]->getType())) {
-			//gobj->setOrigin(_origins[i]);
-			//gobj->restoreOrdinates();
+			gobj->setOrigin(_origins[i]);
+			gobj->restoreOrdinates();
 			//gobj->makeInvisible();
 		}
-	}*/
+	}
 }
 
 void Group::draw(Renderer *gfx, float offset) {
@@ -149,6 +152,7 @@ void Group::step() {
 	if (_finished)
 		return;
 
+	debugC(1, kFreescapeDebugCode, "Stepping group %d", _objectID);
 	if (_step < int(_operations.size() - 1))
 		_step++;
 	else {


Commit: f2699fbbe2e61b80cab739a714396bd8199f414e
    https://github.com/scummvm/scummvm/commit/f2699fbbe2e61b80cab739a714396bd8199f414e
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2024-05-17T10:04:32+02:00

Commit Message:
FREESCAPE: initial implementation of the skybox in castle ega

Changed paths:
  A devtools/create_freescape/castle_background_ega.bmp
    dists/engine-data/freescape.dat
    engines/freescape/freescape.cpp
    engines/freescape/freescape.h
    engines/freescape/games/castle/dos.cpp
    engines/freescape/gfx.h
    engines/freescape/gfx_opengl.cpp
    engines/freescape/gfx_opengl.h


diff --git a/devtools/create_freescape/castle_background_ega.bmp b/devtools/create_freescape/castle_background_ega.bmp
new file mode 100644
index 00000000000..226c0fbb0c5
Binary files /dev/null and b/devtools/create_freescape/castle_background_ega.bmp differ
diff --git a/dists/engine-data/freescape.dat b/dists/engine-data/freescape.dat
index 98340536ccd..6ab6f6f5576 100644
Binary files a/dists/engine-data/freescape.dat and b/dists/engine-data/freescape.dat differ
diff --git a/engines/freescape/freescape.cpp b/engines/freescape/freescape.cpp
index b354c3d2094..55092698199 100644
--- a/engines/freescape/freescape.cpp
+++ b/engines/freescape/freescape.cpp
@@ -127,8 +127,10 @@ FreescapeEngine::FreescapeEngine(OSystem *syst, const ADGameDescription *gd)
 
 	_border = nullptr;
 	_title = nullptr;
+	_background = nullptr;
 	_titleTexture = nullptr;
 	_borderTexture = nullptr;
+	_skyTexture = nullptr;
 	_uiTexture = nullptr;
 	_fontLoaded = false;
 	_dataBundle = nullptr;
@@ -200,10 +202,16 @@ FreescapeEngine::~FreescapeEngine() {
 		delete _border;
 	}
 
+	if (_background) {
+		_background->free();
+		delete _background;
+	}
+
 	if (_gfx->_isAccelerated) {
 		delete _borderTexture;
 		delete _uiTexture;
 		delete _titleTexture;
+		delete _skyTexture;
 	}
 
 	for (auto &it : _areaMap) {
@@ -320,6 +328,13 @@ void FreescapeEngine::clearBackground() {
 void FreescapeEngine::drawBackground() {
 	clearBackground();
 	_gfx->drawBackground(_currentArea->_skyColor);
+
+	if (isCastle()) {
+		assert(_background);
+		if (!_skyTexture)
+			_skyTexture = _gfx->createTexture(_background);
+		_gfx->drawSkybox(_skyTexture, _position);
+	}
 }
 
 void FreescapeEngine::drawFrame() {
diff --git a/engines/freescape/freescape.h b/engines/freescape/freescape.h
index 0c74167eceb..5e811aae3b5 100644
--- a/engines/freescape/freescape.h
+++ b/engines/freescape/freescape.h
@@ -154,9 +154,13 @@ public:
 	virtual void drawCrossair(Graphics::Surface *surface);
 	Graphics::ManagedSurface *_border;
 	Graphics::ManagedSurface *_title;
+	Graphics::Surface *_background;
+
 	Texture *_borderTexture;
 	Texture *_titleTexture;
 	Texture *_uiTexture;
+	Texture *_skyTexture;
+
 	Common::Array<Graphics::Surface *>_indicators;
 	Common::HashMap<uint16, Texture *> _borderCGAByArea;
 	Common::HashMap<uint16, byte *> _paletteCGAByArea;
diff --git a/engines/freescape/games/castle/dos.cpp b/engines/freescape/games/castle/dos.cpp
index 469f1b9b1a8..b3fa4e3e065 100644
--- a/engines/freescape/games/castle/dos.cpp
+++ b/engines/freescape/games/castle/dos.cpp
@@ -111,6 +111,10 @@ void CastleEngine::loadAssetsDOSFullGame() {
 		_areaMap[1]->addFloor();
 		_areaMap[2]->addFloor();
 		delete stream;
+
+		_background = loadBundledImage("castle_background");
+		assert(_background);
+		_background->convertToInPlace(_gfx->_texturePixelFormat);
 	} else
 		error("Not implemented yet");
 
@@ -176,6 +180,9 @@ void CastleEngine::loadAssetsDOSDemo() {
 		_areaMap[1]->addFloor();
 		_areaMap[2]->addFloor();
 		delete stream;
+		_background = loadBundledImage("background");
+		assert(_background);
+		_background->convertToInPlace(_gfx->_texturePixelFormat);
 	} else
 		error("Not implemented yet");
 }
diff --git a/engines/freescape/gfx.h b/engines/freescape/gfx.h
index afac13cad00..1cc6db9cda0 100644
--- a/engines/freescape/gfx.h
+++ b/engines/freescape/gfx.h
@@ -101,6 +101,7 @@ public:
 	virtual void drawBackground(uint8 color);
 
 	void drawEclipse(uint8 color1, uint8 color2, float difference);
+	virtual void drawSkybox(Texture *texture, Math::Vector3d camera) {};
 	virtual void drawCelestialBody(Math::Vector3d position, float radius, uint8 color) {};
 
 	Common::Rect viewport() const;
diff --git a/engines/freescape/gfx_opengl.cpp b/engines/freescape/gfx_opengl.cpp
index 9a51ca3ed26..1ed503926cf 100644
--- a/engines/freescape/gfx_opengl.cpp
+++ b/engines/freescape/gfx_opengl.cpp
@@ -156,6 +156,41 @@ void OpenGLRenderer::drawTexturedRect2D(const Common::Rect &screenRect, const Co
 	glFlush();
 }
 
+void OpenGLRenderer::drawSkybox(Texture *texture, Math::Vector3d camera) {
+	OpenGLTexture *glTexture = static_cast<OpenGLTexture *>(texture);
+
+	glDisable(GL_DEPTH_TEST);
+	glEnable(GL_TEXTURE_2D);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+
+	glBindTexture(GL_TEXTURE_2D, glTexture->_id);
+	glVertexPointer(3, GL_FLOAT, 0, _skyVertices);
+	glNormalPointer(GL_FLOAT, 0, _skyNormals);
+	glTexCoordPointer(2, GL_FLOAT, 0, _skyUvs);
+
+	glEnableClientState(GL_VERTEX_ARRAY);
+	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+	glEnableClientState(GL_NORMAL_ARRAY);
+
+	glPolygonMode(GL_BACK, GL_FILL);
+
+	glPushMatrix();
+	{
+		glTranslatef(camera.x(), camera.y(), camera.z());
+		glDrawArrays(GL_QUADS, 0, 16);
+	}
+	glPopMatrix();
+
+	glDisableClientState(GL_NORMAL_ARRAY);
+	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+	glDisableClientState(GL_VERTEX_ARRAY);
+
+	glBindTexture(GL_TEXTURE_2D, 0);
+	glDisable(GL_TEXTURE_2D);
+	glEnable(GL_DEPTH_TEST);
+	glFlush();
+}
+
 void OpenGLRenderer::updateProjectionMatrix(float fov, float nearClipPlane, float farClipPlane) {
 	glMatrixMode(GL_PROJECTION);
 	glLoadIdentity();
diff --git a/engines/freescape/gfx_opengl.h b/engines/freescape/gfx_opengl.h
index 9ea1ddc5e29..2d3fdbe3607 100644
--- a/engines/freescape/gfx_opengl.h
+++ b/engines/freescape/gfx_opengl.h
@@ -111,8 +111,71 @@ public:
 	virtual void flipBuffer() override;
 	virtual void drawFloor(uint8 color) override;
 	void drawCelestialBody(Math::Vector3d position, float radius, uint8 color) override;
+	void drawSkybox(Texture *texture, Math::Vector3d camera) override;
 
 	virtual Graphics::Surface *getScreenshot() override;
+	GLfloat _skyNormals[16][3] = {
+		0.0, 0.0, 1.0, //front //0
+		0.0, 0.0, 1.0,		//1
+		0.0, 0.0, 1.0,		//2
+		0.0, 0.0, 1.0,		//3
+		0.0, 0.0, -1.0, //back //0
+		0.0, 0.0, -1.0,		//1
+		0.0, 0.0, -1.0,		//2
+		0.0, 0.0, -1.0,		//3
+		-1.0, 0.0, 0.0, //left
+		-1.0, 0.0, 0.0,
+		-1.0, 0.0, 0.0,
+		-1.0, 0.0, 0.0,
+		1.0, 0.0, 0.0, //right
+		1.0, 0.0, 0.0,
+		1.0, 0.0, 0.0,
+		1.0, 0.0, 0.0
+	};
+
+	GLfloat _skyUvs[16][3] = {
+		0.0f, 0.0f, //1
+		0.0f, 2.0f, //2
+		1.0f, 2.0f, //3
+		1.0f, 0.0f, //front //4
+
+		1.0f, 0.0f, //1
+		0.0f, 0.0f, //2
+		0.0f, 2.0f, //back //3
+		1.0f, 2.0f, //4
+
+		0.0f, 0.0f, //left //1
+		1.0f, 0.0f, //2
+		1.0f, 2.0f, //3
+		0.0f, 2.0f, //4
+
+		1.0f, 0.0f, //right //1
+		0.0f, 0.0f, //2
+		0.0f, 2.0f, //3
+		1.0f, 2.0f, //4
+	};
+
+	GLfloat _skyVertices[16][3] = {
+		-81280.0, 8128.0, 81280.0,		//1	// Vertex #0 front
+		-81280.0, -8128.0, 81280.0,	//2	// Vertex #1
+		81280.0,  -8128.0, 81280.0,	//3	// Vertex #2
+		81280.0,  8128.0, 81280.0,		//4	// Vertex #3
+
+		81280.0f, -8128.0f, -81280.0f, //back //1
+		-81280.0f, -8128.0f, -81280.0f, //2
+		-81280.0f,  8128.0f, -81280.0f, //3
+		81280.0f,  8128.0f, -81280.0f, //4
+
+		-81280.0f,  8128.0f,  81280.0f, //left //1
+		-81280.0f,  8128.0f, -81280.0f, //2
+		-81280.0f, -8128.0f, -81280.0f, //3
+		-81280.0f, -8128.0f,  81280.0f, //4
+
+		81280.0f,  8128.0f, -81280.0f, //right //1
+		81280.0f,  8128.0f,  81280.0f, //2
+		81280.0f, -8128.0f,  81280.0f,//3
+		81280.0f, -8128.0f, -81280.0f,//4
+	};
 };
 
 } // End of namespace Freescape


Commit: 702f535557ff41ae39c499455a4e944d8e759105
    https://github.com/scummvm/scummvm/commit/702f535557ff41ae39c499455a4e944d8e759105
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2024-05-17T10:04:32+02:00

Commit Message:
FREESCAPE: fixes for the tinyGL renderer

Changed paths:
    engines/freescape/area.cpp
    engines/freescape/gfx_tinygl.cpp


diff --git a/engines/freescape/area.cpp b/engines/freescape/area.cpp
index 7a4e3c87e24..ff3d584bb5b 100644
--- a/engines/freescape/area.cpp
+++ b/engines/freescape/area.cpp
@@ -228,7 +228,7 @@ void Area::draw(Freescape::Renderer *gfx, uint32 animationTicks, Math::Vector3d
 	ObjectArray planarObjects;
 	ObjectArray nonPlanarObjects;
 	Object *floor = nullptr;
-	float offset = 0.5;
+	float offset = !gfx->_isAccelerated ? 1.0 : 0.5;
 
 	for (auto &obj : _drawableObjects) {
 		if (!obj->isDestroyed() && !obj->isInvisible()) {
diff --git a/engines/freescape/gfx_tinygl.cpp b/engines/freescape/gfx_tinygl.cpp
index 0384f7cb0a7..b1ce5b79280 100644
--- a/engines/freescape/gfx_tinygl.cpp
+++ b/engines/freescape/gfx_tinygl.cpp
@@ -76,6 +76,7 @@ void TinyGLRenderer::init() {
 }
 
 void TinyGLRenderer::setViewport(const Common::Rect &rect) {
+	_viewport = rect;
 	tglViewport(rect.left, g_system->getHeight() - rect.bottom, rect.width(), rect.height());
 }
 
@@ -263,8 +264,50 @@ void TinyGLRenderer::useColor(uint8 r, uint8 g, uint8 b) {
 }
 
 void TinyGLRenderer::clear(uint8 r, uint8 g, uint8 b, bool ignoreViewport) {
-	tglClearColor(r / 255., g / 255., b / 255., 1.0);
-	tglClear(TGL_COLOR_BUFFER_BIT | TGL_DEPTH_BUFFER_BIT);
+	tglClear(TGL_DEPTH_BUFFER_BIT);
+	if (ignoreViewport) {
+		tglClearColor(r / 255., g / 255., b / 255., 1.0);
+		tglClear(TGL_COLOR_BUFFER_BIT);
+	} else {
+		// Disable viewport
+		tglViewport(0, 0, g_system->getWidth(), g_system->getHeight());
+		useColor(r, g, b);
+
+		tglMatrixMode(TGL_PROJECTION);
+		tglPushMatrix();
+		tglLoadIdentity();
+
+		tglOrtho(0, _screenW, _screenH, 0, 0, 1);
+		tglMatrixMode(TGL_MODELVIEW);
+		tglPushMatrix();
+		tglLoadIdentity();
+
+		tglDisable(TGL_DEPTH_TEST);
+		tglDepthMask(TGL_FALSE);
+
+		tglEnableClientState(TGL_VERTEX_ARRAY);
+		copyToVertexArray(0, Math::Vector3d(_viewport.left, _viewport.top, 0));
+		copyToVertexArray(1, Math::Vector3d(_viewport.left, _viewport.bottom, 0));
+		copyToVertexArray(2, Math::Vector3d(_viewport.right, _viewport.bottom, 0));
+
+		copyToVertexArray(3, Math::Vector3d(_viewport.left, _viewport.top, 0));
+		copyToVertexArray(4, Math::Vector3d(_viewport.right, _viewport.top, 0));
+		copyToVertexArray(5, Math::Vector3d(_viewport.right, _viewport.bottom, 0));
+
+		tglVertexPointer(3, TGL_FLOAT, 0, _verts);
+		tglDrawArrays(TGL_TRIANGLES, 0, 6);
+		tglDisableClientState(TGL_VERTEX_ARRAY);
+
+		tglEnable(TGL_DEPTH_TEST);
+		tglDepthMask(TGL_TRUE);
+
+		tglPopMatrix();
+		tglMatrixMode(TGL_PROJECTION);
+		tglPopMatrix();
+
+		// Restore viewport
+		tglViewport(_viewport.left, g_system->getHeight() - _viewport.bottom, _viewport.width(), _viewport.height());
+	}
 }
 
 void TinyGLRenderer::drawFloor(uint8 color) {




More information about the Scummvm-git-logs mailing list