[Scummvm-cvs-logs] scummvm master -> 1b8200fd687ad3f2c183f3c7420badff6beb43e1

m-kiewitz m_kiewitz at users.sourceforge.net
Tue Jun 9 12:18:29 CEST 2015


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

Summary:
1b8200fd68 SHERLOCK: 3DO intro: implement fade in/out/merge


Commit: 1b8200fd687ad3f2c183f3c7420badff6beb43e1
    https://github.com/scummvm/scummvm/commit/1b8200fd687ad3f2c183f3c7420badff6beb43e1
Author: Martin Kiewitz (m_kiewitz at users.sourceforge.net)
Date: 2015-06-09T12:14:41+02:00

Commit Message:
SHERLOCK: 3DO intro: implement fade in/out/merge

Changed paths:
    engines/sherlock/scalpel/scalpel.cpp
    engines/sherlock/screen.cpp
    engines/sherlock/screen.h



diff --git a/engines/sherlock/scalpel/scalpel.cpp b/engines/sherlock/scalpel/scalpel.cpp
index 98d7588..6fad32c 100644
--- a/engines/sherlock/scalpel/scalpel.cpp
+++ b/engines/sherlock/scalpel/scalpel.cpp
@@ -563,21 +563,22 @@ bool ScalpelEngine::showCityCutscene3DO() {
 		finished = _animation->play3DO("26open1", true, 1, 255, 2);
 
 	if (finished) {
-		// TODO: Both of these should actually fade into the screen
-		_screen->_backBuffer2.blitFrom(*_screen);
+		_screen->_backBuffer1.blitFrom(*_screen); // save into backbuffer 1, used for fade
+		_screen->_backBuffer2.blitFrom(*_screen); // save into backbuffer 2, for restoring later
 
 		// "London, England"
 		ImageFile3DO titleImage_London("title2a.cel");
+		_screen->_backBuffer1.transBlitFromUnscaled3DO(titleImage_London[0]._frame, Common::Point(30, 50));
 
-		_screen->transBlitFromUnscaled3DO(titleImage_London[0]._frame, Common::Point(30, 50));
-		finished = _events->delay(2000, true);
+		_screen->fadeIntoScreen3DO(1);
+		finished = _events->delay(1500, true);
 
 		if (finished) {
 			// "November, 1888"
 			ImageFile3DO titleImage_November("title2b.cel");
+			_screen->_backBuffer1.transBlitFromUnscaled3DO(titleImage_November[0]._frame, Common::Point(100, 100));
 
-			_screen->transBlitFromUnscaled3DO(titleImage_November[0]._frame, Common::Point(100, 100));
-
+			_screen->fadeIntoScreen3DO(1);
 			finished = _music->waitUntilMSec(14700, 0, 0, 5000);
 		}
 
@@ -591,10 +592,14 @@ bool ScalpelEngine::showCityCutscene3DO() {
 		finished = _animation->play3DO("26open2", true, 1, 0, 2);
 
 	if (finished) {
+		_screen->_backBuffer1.blitFrom(*_screen); // save into backbuffer 1, used for fade
+
 		// "Sherlock Holmes" (title)
 		ImageFile3DO titleImage_SherlockHolmesTitle("title1ab.cel");
+		_screen->_backBuffer1.transBlitFromUnscaled3DO(titleImage_SherlockHolmesTitle[0]._frame, Common::Point(34, 5));
 
-		_screen->transBlitFromUnscaled3DO(titleImage_SherlockHolmesTitle[0]._frame, Common::Point(34, 5));
+		// Blend in
+		_screen->fadeIntoScreen3DO(2);
 		finished = _events->delay(500, true);
 
 		// Title should fade in, Copyright should be displayed a bit after that
@@ -604,53 +609,52 @@ bool ScalpelEngine::showCityCutscene3DO() {
 			_screen->transBlitFromUnscaled3DO(titleImage_Copyright[0]._frame, Common::Point(20, 190));
 			finished = _events->delay(3500, true);
 		}
-		// Title is supposed to get faded away after that
 	}
 
 	if (finished)
 		finished = _music->waitUntilMSec(33600, 0, 0, 2000);
 
 	if (finished) {
-		// TODO: fade to black
-		_screen->clear();
+		// Fade to black
+		_screen->_backBuffer1.clear();
+		_screen->fadeIntoScreen3DO(3);
 	}
 
 	if (finished) {
 		// "In the alley behind the Regency Theatre..."
 		ImageFile3DO titleImage_InTheAlley("title1d.cel");
+		_screen->_backBuffer1.transBlitFromUnscaled3DO(titleImage_InTheAlley[0]._frame, Common::Point(72, 51));
 
-		_screen->transBlitFromUnscaled3DO(titleImage_InTheAlley[0]._frame, Common::Point(72, 51));
-		// TODO: Supposed to get faded in and out
+		// Fade in
+		_screen->fadeIntoScreen3DO(4);
 		finished = _music->waitUntilMSec(39900, 0, 0, 2500);
 
 		// Fade out
-		_screen->clear();
+		_screen->_backBuffer1.clear();
+		_screen->fadeIntoScreen3DO(4);
 	}
 	return finished;
 }
 
 bool ScalpelEngine::showAlleyCutscene3DO() {
-	bool finished = _music->waitUntilMSec(44000, 0, 0, 1000);
+	bool finished = _music->waitUntilMSec(43500, 0, 0, 1000);
 
 	if (finished)
 		finished = _animation->play3DO("27PRO1", true, 1, 3, 2);
 
 	if (finished) {
 		// Fade out...
-		_screen->clear();
+		_screen->_backBuffer1.clear();
+		_screen->fadeIntoScreen3DO(3);
 
-		finished = _music->waitUntilMSec(66700, 0, 0, 1000);
+		finished = _music->waitUntilMSec(67100, 0, 0, 1000); // 66700
 	}
 
 	if (finished)
 		finished = _animation->play3DO("27PRO2", true, 1, 0, 2);
 
-	if (finished) {
-		// Fade out
-		_screen->clear();
-
+	if (finished)
 		finished = _music->waitUntilMSec(76000, 0, 0, 1000);
-	}
 
 	if (finished) {
 		// Show screaming victim
@@ -667,8 +671,9 @@ bool ScalpelEngine::showAlleyCutscene3DO() {
 	}
 
 	if (finished) {
-		// TODO: quick fade out
-		_screen->clear();
+		// Fade out
+		_screen->_backBuffer1.clear();
+		_screen->fadeIntoScreen3DO(5);
 
 		finished = _music->waitUntilMSec(84400, 0, 0, 2000);
 	}
@@ -677,17 +682,18 @@ bool ScalpelEngine::showAlleyCutscene3DO() {
 		finished = _animation->play3DO("27PRO3", true, 1, 0, 2);
 
 	if (finished) {
-		// Fade to black
-		_screen->clear();
+		// Fade out
+		_screen->_backBuffer1.clear();
+		_screen->fadeIntoScreen3DO(5);
 	}
 
 	if (finished) {
 		// "Early the following morning on Baker Street..."
 		ImageFile3DO titleImage_EarlyTheFollowingMorning("title3.cel");
+		_screen->_backBuffer1.transBlitFromUnscaled3DO(titleImage_EarlyTheFollowingMorning[0]._frame, Common::Point(35, 51));
 
-		_screen->transBlitFromUnscaled3DO(titleImage_EarlyTheFollowingMorning[0]._frame, Common::Point(35, 51));
-		// TODO: Fade in
-
+		// Fade in
+		_screen->fadeIntoScreen3DO(4);
 		finished = _music->waitUntilMSec(96700, 0, 0, 3000);
 	}
 
@@ -699,7 +705,8 @@ bool ScalpelEngine::showStreetCutscene3DO() {
 
 	if (finished) {
 		// fade out "Early the following morning..."
-		_screen->clear();
+		_screen->_backBuffer1.clear();
+		_screen->fadeIntoScreen3DO(4);
 
 		// wait for music a bit
 		finished = _music->waitUntilMSec(100300, 0, 0, 1000);
@@ -710,8 +717,11 @@ bool ScalpelEngine::showStreetCutscene3DO() {
 	if (finished)
 		finished = _animation->play3DO("14NOTE", true, 1, 0, 3);
 
-	// TODO: fade out
-	_screen->clear();
+	if (finished) {
+		// Fade out
+		_screen->_backBuffer1.clear();
+		_screen->fadeIntoScreen3DO(4);
+	}
 
 	return finished;
 }
diff --git a/engines/sherlock/screen.cpp b/engines/sherlock/screen.cpp
index de93d0a..de9bf51 100644
--- a/engines/sherlock/screen.cpp
+++ b/engines/sherlock/screen.cpp
@@ -231,6 +231,90 @@ void Screen::verticalTransition() {
 	}
 }
 
+void Screen::fadeIntoScreen3DO(int speed) {
+	Events &events = *_vm->_events;
+	Common::Rect changedRect;
+	uint16 *currentScreenBasePtr = (uint16 *)getPixels();
+	uint16 *targetScreenBasePtr = (uint16 *)_backBuffer->getPixels();
+	uint16 *currentScreenPtr = NULL;
+	uint16 *targetScreenPtr = NULL;
+	uint16  currentScreenPixel = 0;
+	uint16  targetScreenPixel = 0;
+
+	uint16  currentScreenPixelRed = 0;
+	uint16  currentScreenPixelGreen = 0;
+	uint16  currentScreenPixelBlue = 0;
+
+	uint16  targetScreenPixelRed = 0;
+	uint16  targetScreenPixelGreen = 0;
+	uint16  targetScreenPixelBlue = 0;
+
+	uint16  screenWidth = this->w();
+	uint16  screenHeight = this->h();
+	uint16  screenX = 0;
+	uint16  screenY = 0;
+	uint16  pixelsChanged = 0;
+
+	_dirtyRects.clear();
+
+	do {
+		pixelsChanged = 0;
+		currentScreenPtr = currentScreenBasePtr;
+		targetScreenPtr = targetScreenBasePtr;
+
+		for (screenY = 0; screenY < screenHeight; screenY++) {
+			for (screenX = 0; screenX < screenWidth; screenX++) {
+				currentScreenPixel = *currentScreenPtr;
+				targetScreenPixel  = *targetScreenPtr;
+
+				if (currentScreenPixel != targetScreenPixel) {
+					// pixel doesn't match, adjust accordingly
+					currentScreenPixelRed   = currentScreenPixel & 0xF800;
+					currentScreenPixelGreen = currentScreenPixel & 0x07E0;
+					currentScreenPixelBlue  = currentScreenPixel & 0x001F;
+					targetScreenPixelRed    = targetScreenPixel & 0xF800;
+					targetScreenPixelGreen  = targetScreenPixel & 0x07E0;
+					targetScreenPixelBlue   = targetScreenPixel & 0x001F;
+
+					if (currentScreenPixelRed != targetScreenPixelRed) {
+						if (currentScreenPixelRed < targetScreenPixelRed) {
+							currentScreenPixelRed += 0x0800;
+						} else {
+							currentScreenPixelRed -= 0x0800;
+						}
+					}
+					if (currentScreenPixelGreen != targetScreenPixelGreen) {
+						// Adjust +2/-2 because we are running RGB555 at RGB565
+						if (currentScreenPixelGreen < targetScreenPixelGreen) {
+							currentScreenPixelGreen += 0x0040;
+						} else {
+							currentScreenPixelGreen -= 0x0040;
+						}
+					}
+					if (currentScreenPixelBlue != targetScreenPixelBlue) {
+						if (currentScreenPixelBlue < targetScreenPixelBlue) {
+							currentScreenPixelBlue += 0x0001;
+						} else {
+							currentScreenPixelBlue -= 0x0001;
+						}
+					}
+					*currentScreenPtr = currentScreenPixelRed | currentScreenPixelGreen | currentScreenPixelBlue;
+					pixelsChanged++;
+				}
+
+				currentScreenPtr++;
+				targetScreenPtr++;
+			}
+		}
+
+		// Too much considered dirty at the moment
+		addDirtyRect(Common::Rect(0, 0, screenWidth, screenHeight));
+
+		events.pollEvents();
+		events.delay(10 * speed);
+	} while ((pixelsChanged) && (!_vm->shouldQuit()));
+}
+
 void Screen::restoreBackground(const Common::Rect &r) {
 	if (r.width() > 0 && r.height() > 0) {
 		Common::Rect tempRect = r;
diff --git a/engines/sherlock/screen.h b/engines/sherlock/screen.h
index 9d394da..e4cc665 100644
--- a/engines/sherlock/screen.h
+++ b/engines/sherlock/screen.h
@@ -149,6 +149,11 @@ public:
 	void verticalTransition();
 
 	/**
+	 * Fade backbuffer 1 into screen (3DO RGB!)
+	 */
+	void fadeIntoScreen3DO(int speed);
+
+	/**
 	 * Prints the text passed onto the back buffer at the given position and color.
 	 * The string is then blitted to the screen
 	 */






More information about the Scummvm-git-logs mailing list