[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