[Scummvm-git-logs] scummvm master -> 6a53897ac379c1796a9588be0a7e71058ee7aedb

alxpnv noreply at scummvm.org
Thu Nov 25 11:51:33 UTC 2021


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

Summary:
f1baae54b9 ASYLUM: (ResourceViewer) add palette view mode
6a53897ac3 ASYLUM: switch lighting effects to synchronous model


Commit: f1baae54b9cad6d6dbe7a88d4fb56665eb704523
    https://github.com/scummvm/scummvm/commit/f1baae54b9cad6d6dbe7a88d4fb56665eb704523
Author: alxpnv (alxpnv22 at yahoo.com)
Date: 2021-11-25T14:55:25+03:00

Commit Message:
ASYLUM: (ResourceViewer) add palette view mode

Changed paths:
    engines/asylum/views/resviewer.cpp
    engines/asylum/views/resviewer.h


diff --git a/engines/asylum/views/resviewer.cpp b/engines/asylum/views/resviewer.cpp
index 512f0335d3..291775bc51 100644
--- a/engines/asylum/views/resviewer.cpp
+++ b/engines/asylum/views/resviewer.cpp
@@ -76,8 +76,7 @@ ResourceViewer::ResourceViewer(AsylumEngine *engine) : _vm(engine), _resource(_v
 bool ResourceViewer::setResourceId(ResourceId resourceId) {
 	if (resourceId == kResourceNone ||
 		!getResource()->get(resourceId) ||
-		strncmp((const char *)getResource()->get(resourceId)->data, "D3GR", 4) ||
-		getResource()->get(resourceId)->size == 800)
+		strncmp((const char *)getResource()->get(resourceId)->data, "D3GR", 4))
 
 		return false;
 
@@ -89,8 +88,15 @@ bool ResourceViewer::setResourceId(ResourceId resourceId) {
 
 	_frameIncrement = 1;
 	_x = _y = 0;
-	_width  = _resource.getFrame(0)->getWidth();
-	_height = _resource.getFrame(0)->getHeight();
+
+	if (isPalette(_resourceId)) {
+		_width  = 0;
+		_height = 0;
+	} else {
+		_width  = _resource.getFrame(0)->getWidth();
+		_height = _resource.getFrame(0)->getHeight();
+	}
+
 	_scroll = _width > 640 || _height > 480;
 	_resPack = RESOURCE_PACK(_resourceId);
 	_paletteIndex = 0;
@@ -105,7 +111,7 @@ bool ResourceViewer::setResourceId(ResourceId resourceId) {
 	return true;
 }
 
-void ResourceViewer::update() {
+void ResourceViewer::drawResource() {
 	int16 x, y;
 	GraphicFrame *frame = _resource.getFrame(_frameIndex);
 
@@ -118,12 +124,7 @@ void ResourceViewer::update() {
 	}
 
 	getScreen()->setPalette(MAKE_RESOURCE(_resPack, paletteIds[_resPack][_paletteIndex]));
-
-	getCursor()->hide();
-	getScreen()->clear();
 	getScreen()->draw(_resourceId, _frameIndex, Common::Point(x, y));
-	getText()->draw(Common::Point(615, 440), Common::String::format("%X", _resourceId).c_str());
-	getScreen()->copyBackBufferToScreen();
 
 	if (_frameCount > 1 && _animate) {
 		if (_frameIndex + 1 >= (int)_frameCount)
@@ -135,6 +136,33 @@ void ResourceViewer::update() {
 	}
 }
 
+bool ResourceViewer::isPalette(ResourceId resourceId) {
+	return getResource()->get(resourceId)->size == 800;
+}
+
+void ResourceViewer::drawPalette() {
+	const int size = 20;
+	const int x0 = (640 - size * 16) / 2, y0 = (480 - size * 16) / 2;
+
+	getScreen()->setPalette(_resourceId);
+	for (int i = 0, color = 0; i < 16; i++)
+		for (int j = 0; j < 16; j++, color++)
+			getScreen()->fillRect(x0 + j * size, y0 + i * size, size, size, color);
+}
+
+void ResourceViewer::update() {
+	getCursor()->hide();
+	getScreen()->clear();
+
+	if (isPalette(_resourceId))
+		drawPalette();
+	else
+		drawResource();
+
+	getText()->draw(Common::Point(615, 440), Common::String::format("%X", _resourceId).c_str());
+	getScreen()->copyBackBufferToScreen();
+}
+
 void ResourceViewer::key(const AsylumEvent &evt) {
 	switch (evt.kbd.keycode) {
 	default:
diff --git a/engines/asylum/views/resviewer.h b/engines/asylum/views/resviewer.h
index f592aa24ee..acf26fc530 100644
--- a/engines/asylum/views/resviewer.h
+++ b/engines/asylum/views/resviewer.h
@@ -56,6 +56,10 @@ private:
 	int _paletteIndex;
 	bool _animate;
 
+	bool isPalette(ResourceId resourceId);
+	void drawPalette();
+	void drawResource();
+
 	void key(const AsylumEvent &evt);
 	void update();
 };


Commit: 6a53897ac379c1796a9588be0a7e71058ee7aedb
    https://github.com/scummvm/scummvm/commit/6a53897ac379c1796a9588be0a7e71058ee7aedb
Author: alxpnv (alxpnv22 at yahoo.com)
Date: 2021-11-25T14:55:25+03:00

Commit Message:
ASYLUM: switch lighting effects to synchronous model

Changed paths:
    engines/asylum/asylum.cpp
    engines/asylum/resources/actor.cpp
    engines/asylum/resources/script.cpp
    engines/asylum/resources/script.h
    engines/asylum/shared.h
    engines/asylum/system/screen.cpp
    engines/asylum/system/screen.h
    engines/asylum/views/scene.cpp


diff --git a/engines/asylum/asylum.cpp b/engines/asylum/asylum.cpp
index 04e062d38c..7d0ade0c37 100644
--- a/engines/asylum/asylum.cpp
+++ b/engines/asylum/asylum.cpp
@@ -177,8 +177,9 @@ Common::Error AsylumEngine::run() {
 
 		_system->delayMillis(10);
 
-		if (!screen()->isFading())
-			_system->updateScreen();
+		screen()->processPaletteFadeQueue();
+
+		_system->updateScreen();
 
 		if (_scene)
 			checkAchievements();
@@ -368,8 +369,7 @@ void AsylumEngine::playIntro() {
 					}
 				}
 
-				if (!screen()->isFading())
-					_system->updateScreen();
+				_system->updateScreen();
 				_system->delayMillis(100);
 
 			} while (_sound->isPlaying(introSpeech) && !skip);
diff --git a/engines/asylum/resources/actor.cpp b/engines/asylum/resources/actor.cpp
index e15f3c48e5..c80d6c71c1 100644
--- a/engines/asylum/resources/actor.cpp
+++ b/engines/asylum/resources/actor.cpp
@@ -3203,11 +3203,11 @@ void Actor::actionAreaCheck() {
 
 	if (!area->paletteResourceId || area->paletteResourceId == actorArea->paletteResourceId || _index) {
 		if (area->paletteResourceId != actorArea->paletteResourceId && !_index)
-			_vm->screen()->startPaletteFade(getWorld()->currentPaletteId, 100, 3);
+			_vm->screen()->queuePaletteFade(getWorld()->currentPaletteId, 100, 3);
 
 		_actionIdx3 = areaIndex;
 	} else {
-		_vm->screen()->startPaletteFade(area->paletteResourceId, 50, 3);
+		_vm->screen()->queuePaletteFade(area->paletteResourceId, 50, 3);
 		_actionIdx3 = areaIndex;
 	}
 }
diff --git a/engines/asylum/resources/script.cpp b/engines/asylum/resources/script.cpp
index de5508e951..c6370ecc33 100644
--- a/engines/asylum/resources/script.cpp
+++ b/engines/asylum/resources/script.cpp
@@ -177,7 +177,7 @@ ScriptManager::ScriptManager(AsylumEngine *engine) : _vm(engine) {
 	ADD_OPCODE(PlaySpeechScene2);
 	ADD_OPCODE(MoveScenePositionFromActor);
 	ADD_OPCODE(PaletteFade);
-	ADD_OPCODE(StartPaletteFadeThread);
+	ADD_OPCODE(QueuePaletteFade);
 	ADD_OPCODE(PlaySoundUpdateObject);
 	ADD_OPCODE(ActorFaceTarget);
 	ADD_OPCODE(HideMatteBars);
@@ -1500,8 +1500,8 @@ END_OPCODE
 
 //////////////////////////////////////////////////////////////////////////
 // Opcode 0x45
-IMPLEMENT_OPCODE(StartPaletteFadeThread)
-	getScreen()->startPaletteFade(getWorld()->currentPaletteId, cmd->param1, cmd->param2);
+IMPLEMENT_OPCODE(QueuePaletteFade)
+	getScreen()->queuePaletteFade(getWorld()->currentPaletteId, cmd->param1, cmd->param2);
 END_OPCODE
 
 //////////////////////////////////////////////////////////////////////////
diff --git a/engines/asylum/resources/script.h b/engines/asylum/resources/script.h
index c03d7af214..600bb87622 100644
--- a/engines/asylum/resources/script.h
+++ b/engines/asylum/resources/script.h
@@ -417,7 +417,7 @@ private:
 	DECLARE_OPCODE(PlaySpeechScene2);
 	DECLARE_OPCODE(MoveScenePositionFromActor);
 	DECLARE_OPCODE(PaletteFade);
-	DECLARE_OPCODE(StartPaletteFadeThread);
+	DECLARE_OPCODE(QueuePaletteFade);
 	DECLARE_OPCODE(PlaySoundUpdateObject);
 	DECLARE_OPCODE(ActorFaceTarget);
 	DECLARE_OPCODE(HideMatteBars);
diff --git a/engines/asylum/shared.h b/engines/asylum/shared.h
index 999ddb17c4..3b8c7e97c3 100644
--- a/engines/asylum/shared.h
+++ b/engines/asylum/shared.h
@@ -430,7 +430,7 @@ enum OpcodeType {
 	kOpcodePlaySpeechScene2,
 	kOpcodeMoveScenePositionFromActor,
 	kOpcodePaletteFade,
-	kOpcodeStartPaletteFadeThread,
+	kOpcodeQueuePaletteFade,
 	kOpcodePlaySoundUpdateObject,               // 70
 	kOpcodeActorFaceTarget,
 	kOpcodeHidMatteBars,
diff --git a/engines/asylum/system/screen.cpp b/engines/asylum/system/screen.cpp
index 229be8ac26..d5677a72f6 100644
--- a/engines/asylum/system/screen.cpp
+++ b/engines/asylum/system/screen.cpp
@@ -21,7 +21,6 @@
  */
 
 #include "common/scummsys.h"
-#include "common/timer.h"
 
 #include "asylum/system/screen.h"
 
@@ -51,18 +50,16 @@ Screen::Screen(AsylumEngine *vm) : _vm(vm) ,
 
 	memset(&_currentPalette, 0, sizeof(_currentPalette));
 	memset(&_mainPalette, 0, sizeof(_mainPalette));
+	memset(&_fromPalette, 0, sizeof(_fromPalette));
+	memset(&_toPalette,   0, sizeof(_toPalette));
+
 	_isFading = false;
 	_fadeStop = false;
-	_fadeResourceId = kResourceNone;
-	_fadeTicksWait = 0;
-	_fadeDelta = 0;
 
 	g_debugDrawRects = 0;
 }
 
 Screen::~Screen() {
-	_vm->getTimerManager()->removeTimerProc(&paletteFadeTimer);
-
 	_backBuffer.free();
 
 	clearTransTables();
@@ -356,47 +353,15 @@ void Screen::updatePalette(int32 param) {
 //////////////////////////////////////////////////////////////////////////
 // Palette fading
 //////////////////////////////////////////////////////////////////////////
-void Screen::paletteFadeTimer(void *refCon) {
-	((Screen *)refCon)->handlePaletteFadeTimer();
-}
-
-void Screen::handlePaletteFadeTimer() {
-	// Reset flag
-	_fadeStop = false;
-
-	// Start fading
-	_isFading = true;
-
-	paletteFadeWorker(_fadeResourceId, _fadeTicksWait, _fadeDelta);
-
-	// Remove ourselves as a timer (we finished fading or were interrupted)
-	_vm->getTimerManager()->removeTimerProc(&paletteFadeTimer);
-
-	_isFading = false;
-
-	if (!_fadeQueue.empty()) {
-		FadeParameters fadeParams = _fadeQueue.pop();
-		startPaletteFade(fadeParams.resourceId, fadeParams.ticksWait, fadeParams.delta);
-	}
-}
-
-void Screen::startPaletteFade(ResourceId resourceId, int32 ticksWait, int32 delta) {
-	if (_isFading && resourceId == _fadeResourceId)
+void Screen::queuePaletteFade(ResourceId resourceId, int32 ticksWait, int32 delta) {
+	if (_isFading && !_fadeQueue.empty() && _fadeQueue.front().resourceId == resourceId)
 		return;
 
-	if (_isFading) {
-		FadeParameters fadeParams = {resourceId, ticksWait, delta};
-		_fadeQueue.push(fadeParams);
+	if (ticksWait < 0 || delta <= 0)
 		return;
-	}
-
-	stopPaletteFadeTimer();
-	_fadeResourceId = resourceId;
-	_fadeTicksWait = ticksWait;
-	_fadeDelta = delta;
 
-	// Inverval == 1: we want to execute directly, since we are only going to be called back once
-	_vm->getTimerManager()->installTimerProc(&paletteFadeTimer, 1, this, "Palette fade timer");
+	FadeParameters fadeParams = {resourceId, ticksWait, delta, _vm->getTick(), 1};
+	_fadeQueue.push(fadeParams);
 }
 
 void Screen::stopPaletteFade(char red, char green, char blue) {
@@ -407,13 +372,19 @@ void Screen::stopPaletteFade(char red, char green, char blue) {
 		_mainPalette[i + 2] = (byte)blue;
 	}
 
-	stopPaletteFadeTimer();
+	stopQueuedPaletteFade();
 	setupPalette(nullptr, 0, 0);
 }
 
 void Screen::stopPaletteFadeAndSet(ResourceId id, int32 ticksWait, int32 delta) {
-	stopPaletteFadeTimer();
-	paletteFadeWorker(id, ticksWait, delta);
+	stopQueuedPaletteFade();
+	initQueuedPaletteFade(id, delta);
+
+	for (int i = 1; i < delta + 1; i++) {
+		runQueuedPaletteFade(id, delta, i);
+		g_system->delayMillis((uint32)ticksWait);
+		g_system->updateScreen();
+	}
 }
 
 void Screen::paletteFade(uint32 start, int32 ticksWait, int32 delta) {
@@ -450,17 +421,45 @@ void Screen::paletteFade(uint32 start, int32 ticksWait, int32 delta) {
 	}
 }
 
-void Screen::paletteFadeWorker(ResourceId id, int32 ticksWait, int32 delta) {
-	byte *data = getPaletteData(id);
-
-	if (ticksWait < 0 || delta <= 0)
+void Screen::processPaletteFadeQueue() {
+	if (_fadeQueue.empty())
 		return;
 
+	FadeParameters *current = &_fadeQueue.front();
+	if (_vm->getTick() > current->nextTick) {
+		if (current->step > current->delta) {
+			_isFading = false;
+
+			(void)_fadeQueue.pop();
+			if (_fadeQueue.empty()) {
+				stopQueuedPaletteFade();
+				return;
+			}
+
+			current = &_fadeQueue.front();
+			initQueuedPaletteFade(current->resourceId, current->delta);
+		} else {
+			if (current->step == 1)
+				initQueuedPaletteFade(current->resourceId, current->delta);
+			current->nextTick += current->ticksWait;
+		}
+
+		runQueuedPaletteFade(current->resourceId, current->delta, current->step++);
+	}
+}
+
+void Screen::initQueuedPaletteFade(ResourceId id, int32 delta) {
+	// Reset flag
+	_fadeStop = false;
+
+	// Start fading
+	_isFading = true;
+
+	byte *data = getPaletteData(id);
+
 	// Setup our palette
-	byte original[PALETTE_SIZE];
-	byte palette[PALETTE_SIZE];
-	memcpy(&original, &_mainPalette, sizeof(original));
-	memcpy(&palette,  &_mainPalette, sizeof(palette));
+	memcpy(_fromPalette, _mainPalette, sizeof(_fromPalette));
+	memcpy(_toPalette,   _mainPalette, sizeof(_toPalette));
 
 	// Adjust palette using the target palette data
 	int16 count = READ_LE_UINT16(data);
@@ -469,39 +468,33 @@ void Screen::paletteFadeWorker(ResourceId id, int32 ticksWait, int32 delta) {
 		byte *pData = data + 4;
 
 		for (int16 i = 0; i < count; i++) {
-			palette[i + start]     = (byte)(4 * pData[0]);
-			palette[i + start + 1] = (byte)(4 * pData[1]);
-			palette[i + start + 2] = (byte)(4 * pData[2]);
+			_toPalette[i + start]     = (byte)(4 * pData[0]);
+			_toPalette[i + start + 1] = (byte)(4 * pData[1]);
+			_toPalette[i + start + 2] = (byte)(4 * pData[2]);
 
 			pData += 3;
 		}
 	}
 
 	// Adjust gamma
-	setPaletteGamma(data, (byte *)&palette);
-
-	// Prepare for palette fading loop
-	int32 colorDelta = delta + 1;
-	for (int32 i = 1; i < colorDelta; i++) {
-		for (uint32 j = 3; j < ARRAYSIZE(_mainPalette) - 3; j += 3) {
-			_mainPalette[j]     = (byte)(original[j]     + i * (palette[j]     - original[j])     / colorDelta);
-			_mainPalette[j + 1] = (byte)(original[j + 1] + i * (palette[j + 1] - original[j + 1]) / colorDelta);
-			_mainPalette[j + 2] = (byte)(original[j + 2] + i * (palette[j + 2] - original[j + 2]) / colorDelta);
-		}
-
-		setupPalette(nullptr, 0, 0);
+	setPaletteGamma(data, _toPalette);
+}
 
-		// Original waits for event and so can be interrupted in the middle of the wait
-		g_system->delayMillis((uint32)ticksWait);
-		if (_fadeStop)
-			break;
+void Screen::runQueuedPaletteFade(ResourceId id, int32 delta, int i) {
+	if (_fadeStop)
+		return;
 
-		// Refresh the screen
-		g_system->updateScreen();
+	int32 colorDelta = delta + 1;
+	for (uint32 j = 3; j < ARRAYSIZE(_mainPalette) - 3; j += 3) {
+		_mainPalette[j]     = (byte)(_fromPalette[j]     + i * (_toPalette[j]     - _fromPalette[j])     / colorDelta);
+		_mainPalette[j + 1] = (byte)(_fromPalette[j + 1] + i * (_toPalette[j + 1] - _fromPalette[j + 1]) / colorDelta);
+		_mainPalette[j + 2] = (byte)(_fromPalette[j + 2] + i * (_toPalette[j + 2] - _fromPalette[j + 2]) / colorDelta);
 	}
+
+	setupPalette(nullptr, 0, 0);
 }
 
-void Screen::stopPaletteFadeTimer() {
+void Screen::stopQueuedPaletteFade() {
 	if (!_isFading)
 		return;
 
diff --git a/engines/asylum/system/screen.h b/engines/asylum/system/screen.h
index 24efddc609..650e086974 100644
--- a/engines/asylum/system/screen.h
+++ b/engines/asylum/system/screen.h
@@ -73,8 +73,10 @@ typedef struct GraphicQueueItem {
 
 struct FadeParameters {
 	ResourceId resourceId;
-	int32 ticksWait;
-	int32 delta;
+	int  ticksWait;
+	int  delta;
+	uint nextTick;
+	int  step;
 };
 
 class Screen {
@@ -110,10 +112,11 @@ public:
 	void setupPalette(byte *buffer, int start, int count);
 
 	bool isFading() { return _isFading; }
-	void startPaletteFade(ResourceId resourceId, int32 ticksWait, int32 delta);
+	void queuePaletteFade(ResourceId resourceId, int32 ticksWait, int32 delta);
 	void paletteFade(uint32 start, int32 ticksWait, int32 delta);
 	void stopPaletteFade(char red, char green, char blue);
 	void stopPaletteFadeAndSet(ResourceId id, int32 ticksWait, int32 delta);
+	void processPaletteFadeQueue();
 
 	// Gamma
 	void setPaletteGamma(ResourceId id);
@@ -147,11 +150,6 @@ public:
 	// Used by Writings puzzle
 	const Graphics::Surface &getSurface() const { return _backBuffer; };
 
-protected:
-	// Palette fading Timer
-	static void paletteFadeTimer(void *ptr);
-	void handlePaletteFadeTimer();
-
 private:
 	AsylumEngine *_vm;
 
@@ -171,18 +169,18 @@ private:
 	// Palette
 	byte _currentPalette[PALETTE_SIZE];
 	byte _mainPalette[PALETTE_SIZE];
+	byte _fromPalette[PALETTE_SIZE];
+	byte _toPalette[PALETTE_SIZE];
 	bool _isFading;
 	bool _fadeStop;
-	ResourceId _fadeResourceId;
-	int32 _fadeTicksWait;
-	int32 _fadeDelta;
 	Common::Queue<FadeParameters> _fadeQueue;
 
 	byte *getPaletteData(ResourceId id);
 	void setPaletteGamma(byte *data, byte *target = NULL);
 
-	void paletteFadeWorker(ResourceId id, int32 ticksWait, int32 delta);
-	void stopPaletteFadeTimer();
+	void stopQueuedPaletteFade();
+	void initQueuedPaletteFade(ResourceId id, int32 delta);
+	void runQueuedPaletteFade(ResourceId id, int32 delta, int i);
 
 	// Graphic queue
 	static bool graphicQueueItemComparator(const GraphicQueueItem &item1, const GraphicQueueItem &item2);
diff --git a/engines/asylum/views/scene.cpp b/engines/asylum/views/scene.cpp
index 2a8b39a5c2..b8bad08a16 100644
--- a/engines/asylum/views/scene.cpp
+++ b/engines/asylum/views/scene.cpp
@@ -1834,8 +1834,7 @@ void Scene::playIntroSpeech() {
 		Common::Event ev;
 		_vm->getEventManager()->pollEvent(ev);
 
-		if (!getScreen()->isFading())
-			g_system->updateScreen();
+		g_system->updateScreen();
 		g_system->delayMillis(100);
 
 	} while (getSound()->isPlaying(resourceId));
@@ -2396,8 +2395,7 @@ void Scene::preload() {
 	do {
 		title->update(_vm->getTick());
 
-		if (!getScreen()->isFading())
-			g_system->updateScreen();
+		g_system->updateScreen();
 		g_system->delayMillis(10);
 
 		// Poll events (this ensure we don't freeze the screen)
@@ -2828,8 +2826,7 @@ void Scene::debugShowPolygon(uint32 index, uint32 color) {
 void Scene::debugHighlightPolygon(uint32 index) {
 	debugShowPolygon(index, 0x12);
 	getScreen()->copyBackBufferToScreen();
-	if (!getScreen()->isFading())
-		g_system->updateScreen();
+	g_system->updateScreen();
 }
 
 // SCENE RECTS DEBUG




More information about the Scummvm-git-logs mailing list