aboutsummaryrefslogtreecommitdiff
path: root/engines/sludge/transition.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sludge/transition.cpp')
-rw-r--r--engines/sludge/transition.cpp408
1 files changed, 408 insertions, 0 deletions
diff --git a/engines/sludge/transition.cpp b/engines/sludge/transition.cpp
new file mode 100644
index 0000000000..041e2c97d8
--- /dev/null
+++ b/engines/sludge/transition.cpp
@@ -0,0 +1,408 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+#include <stdint.h>
+#include <string.h>
+
+#include "allfiles.h"
+#include "colours.h"
+#include "backdrop.h"
+#include "graphics.h"
+#include "newfatal.h"
+
+#if 0
+extern GLuint snapshotTextureName;
+#endif
+
+extern unsigned char brightnessLevel;
+
+extern float snapTexW, snapTexH;
+
+unsigned char fadeMode = 2;
+
+
+//----------------------------------------------------
+// PROPER BRIGHTNESS FADING
+//----------------------------------------------------
+
+unsigned lastFrom, lastTo;
+
+void transitionFader() {
+#if 0
+ glEnable(GL_BLEND);
+
+ const GLfloat vertices[] = {
+ 0.f, (GLfloat)winHeight, 0.f,
+ (GLfloat)winWidth, (GLfloat)winHeight, 0.f,
+ 0.f, 0.f, 0.f,
+ (GLfloat)winWidth, 0.f, 0.f
+ };
+
+ glUseProgram(shader.color);
+
+ setPMVMatrix(shader.color);
+ setPrimaryColor(0.0f, 0.0f, 0.0f, 1.0f - brightnessLevel / 255.f);
+ drawQuad(shader.color, vertices, 0);
+
+ glUseProgram(0);
+
+ glDisable(GL_BLEND);
+#endif
+}
+
+void transitionCrossFader() {
+#if 0
+ if (! snapshotTextureName) return;
+
+ glBindTexture(GL_TEXTURE_2D, snapshotTextureName);
+
+ glEnable(GL_BLEND);
+
+ const GLfloat vertices[] = {
+ 0.f, (GLfloat)winHeight, 0.f,
+ (GLfloat)winWidth, (GLfloat)winHeight, 0.f,
+ 0.f, 0.f, 0.f,
+ (GLfloat)winWidth, 0.f, 0.f
+ };
+
+ const GLfloat texCoords[] = {
+ 0.0f, snapTexH,
+ snapTexW, snapTexH,
+ 0.0f, 0.0f,
+ snapTexW, 0.0f
+ };
+
+ glUseProgram(shader.texture);
+
+ setPMVMatrix(shader.texture);
+
+ glUniform1i(glGetUniformLocation(shader.texture, "modulateColor"), 1);
+
+ setPrimaryColor(1.0f, 1.0f, 1.0f, 1.0f - brightnessLevel / 255.f);
+
+ drawQuad(shader.texture, vertices, 1, texCoords);
+
+ glUniform1i(glGetUniformLocation(shader.texture, "modulateColor"), 0);
+ glUseProgram(0);
+
+ glDisable(GL_BLEND);
+#endif
+}
+
+void transitionSnapshotBox() {
+#if 0
+ if (! snapshotTextureName) return;
+
+ //glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+ glBindTexture(GL_TEXTURE_2D, snapshotTextureName);
+
+ float xScale = (float) brightnessLevel * winWidth / 510.f; // 510 = 255*2
+ float yScale = (float) brightnessLevel * winHeight / 510.f;
+
+ const GLfloat vertices[] = {
+ xScale, winHeight - yScale, 0,
+ winWidth - xScale, winHeight - yScale, 0,
+ xScale, yScale, 0,
+ winWidth - xScale, yScale, 0
+ };
+
+ const GLfloat texCoords[] = {
+ 0.0f, snapTexH,
+ snapTexW, snapTexH,
+ 0.0f, 0.0f,
+ snapTexW, 0.0f
+ };
+
+ glUseProgram(shader.texture);
+
+ setPMVMatrix(shader.texture);
+
+ drawQuad(shader.texture, vertices, 1, texCoords);
+
+ glUseProgram(0);
+#endif
+}
+
+//----------------------------------------------------
+// FAST PSEUDO-RANDOM NUMBER STUFF FOR DISOLVE EFFECT
+//----------------------------------------------------
+
+#define KK 17
+uint32_t randbuffer[KK][2]; // history buffer
+int p1, p2;
+
+void resetRandW() {
+ int32_t seed = 12345;
+
+ for (int i = 0; i < KK; i++) {
+ for (int j = 0; j < 2; j++) {
+ seed = seed * 2891336453u + 1;
+ randbuffer[i][j] = seed;
+ }
+ }
+
+ p1 = 0, p2 = 10;
+}
+
+#if 0
+GLubyte *transitionTexture = NULL;
+GLuint transitionTextureName = 0;
+#endif
+
+bool reserveTransitionTexture() {
+#if 0
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+
+ if (! transitionTexture) {
+ transitionTexture = new GLubyte [256 * 256 * 4];
+ if (! checkNew(transitionTexture)) return false;
+ }
+
+ if (! transitionTextureName) glGenTextures(1, &transitionTextureName);
+ glBindTexture(GL_TEXTURE_2D, transitionTextureName);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
+ texImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, transitionTexture, transitionTextureName);
+#endif
+ return true;
+}
+
+
+void transitionDisolve() {
+
+#if 0
+ if (! transitionTextureName) reserveTransitionTexture();
+
+ if (! brightnessLevel) {
+ transitionFader();
+ return;
+ }
+
+ uint32_t n;
+ uint32_t y;
+
+ GLubyte *toScreen = transitionTexture;
+ GLubyte *end = transitionTexture + (256 * 256 * 4);
+
+ do {
+ // generate next number
+ n = randbuffer[p1][1];
+ y = (n << 27) | ((n >> (32 - 27)) + randbuffer[p2][1]);
+
+ n = randbuffer[p1][0];
+ randbuffer[p1][1] = (n << 19) | ((n >> (32 - 19)) + randbuffer[p2][0]);
+ randbuffer[p1][0] = y;
+
+ // rotate list pointers
+ if (! p1 --) p1 = KK - 1;
+ if (! p2 --) p2 = KK - 1;
+
+ if ((y & 255u) > brightnessLevel) {
+ toScreen[0] = toScreen[1] = toScreen[2] = 0;
+ toScreen[3] = 255;
+ } else {
+ toScreen[0] = toScreen[1] = toScreen[2] = toScreen[3] = 0;
+ }
+ toScreen += 4;
+ } while (toScreen < end);
+
+ texImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, transitionTexture, transitionTextureName);
+
+ glEnable(GL_BLEND);
+
+ const GLfloat vertices[] = {
+ 0.f, (GLfloat)winHeight, 0.f,
+ (GLfloat)winWidth, (GLfloat)winHeight, 0.f,
+ 0.f, 0.f, 0.f,
+ (GLfloat)winWidth, 0.f, 0.f
+ };
+
+ const GLfloat texCoords[] = {
+ 0.0f, 1.0f,
+ 1.0f, 1.0f,
+ 0.0f, 0.0f,
+ 1.0f, 0.0f
+ };
+
+ glUseProgram(shader.texture);
+
+ setPMVMatrix(shader.texture);
+
+ glUniform1i(glGetUniformLocation(shader.texture, "modulateColor"), 1);
+
+ setPrimaryColor(1.0f, 1.0f, 1.0f, 1.0f);
+
+ drawQuad(shader.texture, vertices, 1, texCoords);
+
+ glUniform1i(glGetUniformLocation(shader.texture, "modulateColor"), 0);
+ glUseProgram(0);
+
+ glDisable(GL_BLEND);
+#endif
+}
+
+void transitionTV() {
+
+#if 0
+ if (! transitionTextureName) reserveTransitionTexture();
+
+ uint32_t n;
+ uint32_t y;
+
+ GLubyte *toScreen = transitionTexture;
+ GLubyte *end = transitionTexture + (256 * 256 * 4);
+
+ do {
+ // generate next number
+ n = randbuffer[p1][1];
+ y = (n << 27) | ((n >> (32 - 27)) + randbuffer[p2][1]);
+
+ n = randbuffer[p1][0];
+ randbuffer[p1][1] = (n << 19) | ((n >> (32 - 19)) + randbuffer[p2][0]);
+ randbuffer[p1][0] = y;
+
+ // rotate list pointers
+ if (! p1 --) p1 = KK - 1;
+ if (! p2 --) p2 = KK - 1;
+
+ if ((y & 255u) > brightnessLevel) {
+ toScreen[0] = toScreen[1] = toScreen[2] = (n & 255);
+ toScreen[3] = (n & 255);
+ } else {
+ toScreen[0] = toScreen[1] = toScreen[2] = toScreen[3] = 0;
+ }
+ toScreen += 4;
+ } while (toScreen < end);
+
+ texImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, transitionTexture, transitionTextureName);
+
+ glEnable(GL_BLEND);
+
+ const GLfloat vertices[] = {
+ 0.f, (GLfloat)winHeight, 0.f,
+ (GLfloat)winWidth, (GLfloat)winHeight, 0.f,
+ 0.f, 0.f, 0.f,
+ (GLfloat)winWidth, 0.f, 0.f
+ };
+
+ const GLfloat texCoords[] = {
+ 0.0f, 1.0f,
+ 1.0f, 1.0f,
+ 0.0f, 0.0f,
+ 1.0f, 0.0f
+ };
+
+ glUseProgram(shader.texture);
+
+ setPMVMatrix(shader.texture);
+
+ glUniform1i(glGetUniformLocation(shader.texture, "modulateColor"), 1);
+
+ setPrimaryColor(1.0f, 1.0f, 1.0f, 1.0f);
+
+ drawQuad(shader.texture, vertices, 1, texCoords);
+
+ glUniform1i(glGetUniformLocation(shader.texture, "modulateColor"), 0);
+ glUseProgram(0);
+
+ glDisable(GL_BLEND);
+#endif
+}
+
+void transitionBlinds() {
+#if 0
+ if (! transitionTextureName) reserveTransitionTexture();
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+
+ GLubyte *toScreen = transitionTexture;
+
+ int level = brightnessLevel / 8;
+
+ if (level) memset(toScreen, 0, 256 * 32 * level);
+ if (level < 32) memset(toScreen + 256 * 32 * level, 255, 256 * 32 * (32 - level));
+
+ texImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, transitionTexture, transitionTextureName);
+
+ glEnable(GL_BLEND);
+
+ const GLfloat vertices[] = {
+ 0.f, (GLfloat)winHeight, 0.f,
+ (GLfloat)winWidth, (GLfloat)winHeight, 0.f,
+ 0.f, 0.f, 0.f,
+ (GLfloat)winWidth, 0.f, 0.f
+ };
+
+ const GLfloat texCoords[] = {
+ 0.0f, 0.0f,
+ 1.0f, 0.0f,
+ 0.0f, 25.0f,
+ 1.0f, 25.0f
+ };
+
+ glUseProgram(shader.texture);
+
+ setPMVMatrix(shader.texture);
+
+ glUniform1i(glGetUniformLocation(shader.texture, "modulateColor"), 1);
+
+ setPrimaryColor(0.0f, 0.0f, 0.0f, 1.0f);
+
+ drawQuad(shader.texture, vertices, 1, texCoords);
+
+ glUniform1i(glGetUniformLocation(shader.texture, "modulateColor"), 0);
+ glUseProgram(0);
+
+ glDisable(GL_BLEND);
+#endif
+}
+
+//----------------------------------------------------
+
+void fixBrightness() {
+ switch (fadeMode) {
+ case 0:
+ transitionFader();
+ break;
+ case 1:
+ resetRandW();
+ // Fall through!
+ case 2:
+ transitionDisolve();
+ break;
+ case 3:
+ transitionTV();
+ break;
+ case 4:
+ transitionBlinds();
+ break;
+ case 5:
+ transitionCrossFader();
+ break;
+ case 6:
+ transitionSnapshotBox();
+ break;
+
+ }
+}