aboutsummaryrefslogtreecommitdiff
path: root/engines/sludge/zbuffer.cpp
diff options
context:
space:
mode:
authoryinsimei2017-05-26 05:24:38 +0200
committerEugene Sandulenko2017-07-13 18:27:45 +0200
commit219044abf9841461043d6e2acf0d5a48a7c7648b (patch)
treee9d16f9de2317e3596da5a71447e0c823ba3861d /engines/sludge/zbuffer.cpp
parent94439e2ce311734bfe7bb5700a6584b7550ea8f9 (diff)
downloadscummvm-rg350-219044abf9841461043d6e2acf0d5a48a7c7648b.tar.gz
scummvm-rg350-219044abf9841461043d6e2acf0d5a48a7c7648b.tar.bz2
scummvm-rg350-219044abf9841461043d6e2acf0d5a48a7c7648b.zip
SLUDGE: Add sludge files and make it compile
Diffstat (limited to 'engines/sludge/zbuffer.cpp')
-rw-r--r--engines/sludge/zbuffer.cpp205
1 files changed, 205 insertions, 0 deletions
diff --git a/engines/sludge/zbuffer.cpp b/engines/sludge/zbuffer.cpp
new file mode 100644
index 0000000000..6597f3749d
--- /dev/null
+++ b/engines/sludge/zbuffer.cpp
@@ -0,0 +1,205 @@
+/* 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 "common/system.h"
+
+#include "allfiles.h"
+#include "zbuffer.h"
+#include "fileset.h"
+#include "moreio.h"
+#include "newfatal.h"
+#include "graphics.h"
+
+zBufferData zBuffer;
+extern int sceneWidth, sceneHeight;
+
+void killZBuffer() {
+#if 0
+ if (zBuffer.tex) {
+ deleteTextures(1, &zBuffer.texName);
+ zBuffer.texName = 0;
+ delete zBuffer.tex;
+ zBuffer.tex = NULL;
+ }
+ zBuffer.numPanels = 0;
+ zBuffer.originalNum = 0;
+#endif
+}
+
+void sortZPal(int *oldpal, int *newpal, int size) {
+ int i, tmp;
+
+ for (i = 0; i < size; i ++) {
+ newpal[i] = i;
+ }
+
+ if (size < 2) return;
+
+ for (i = 1; i < size; i ++) {
+ if (oldpal[newpal[i]] < oldpal[newpal[i - 1]]) {
+ tmp = newpal[i];
+ newpal[i] = newpal[i - 1];
+ newpal[i - 1] = tmp;
+ i = 0;
+ }
+ }
+}
+
+bool setZBuffer(int y) {
+#if ALLOW_FILE
+ int x, n;
+ uint32_t stillToGo = 0;
+ int yPalette[16], sorted[16], sortback[16];
+
+ killZBuffer();
+
+ setResourceForFatal(y);
+
+ zBuffer.originalNum = y;
+ if (! openFileFromNum(y)) return false;
+ if (fgetc(bigDataFile) != 'S') return fatal("Not a Z-buffer file");
+ if (fgetc(bigDataFile) != 'z') return fatal("Not a Z-buffer file");
+ if (fgetc(bigDataFile) != 'b') return fatal("Not a Z-buffer file");
+
+ switch (fgetc(bigDataFile)) {
+ case 0:
+ zBuffer.width = 640;
+ zBuffer.height = 480;
+ break;
+
+ case 1:
+ zBuffer.width = get2bytes(bigDataFile);
+ zBuffer.height = get2bytes(bigDataFile);
+ break;
+
+ default:
+ return fatal("Extended Z-buffer format not supported in this version of the SLUDGE engine");
+ }
+ if (zBuffer.width != sceneWidth || zBuffer.height != sceneHeight) {
+ char tmp[256];
+ sprintf(tmp, "Z-w: %d Z-h:%d w: %d, h:%d", zBuffer.width, zBuffer.height, sceneWidth, sceneHeight);
+ return fatal("Z-buffer width and height don't match scene width and height", tmp);
+ }
+
+ zBuffer.numPanels = fgetc(bigDataFile);
+ for (y = 0; y < zBuffer.numPanels; y ++) {
+ yPalette[y] = get2bytes(bigDataFile);
+ }
+ sortZPal(yPalette, sorted, zBuffer.numPanels);
+ for (y = 0; y < zBuffer.numPanels; y ++) {
+ zBuffer.panel[y] = yPalette[sorted[y]];
+ sortback[sorted[y]] = y;
+ }
+
+ int picWidth = sceneWidth;
+ int picHeight = sceneHeight;
+ if (! NPOT_textures) {
+ picWidth = getNextPOT(picWidth);
+ picHeight = getNextPOT(picHeight);
+ }
+ zBuffer.tex = new GLubyte [picHeight * picWidth];
+ if (! checkNew(zBuffer.tex)) return false;
+
+ for (y = 0; y < sceneHeight; y ++) {
+ for (x = 0; x < sceneWidth; x ++) {
+ if (stillToGo == 0) {
+ n = fgetc(bigDataFile);
+ stillToGo = n >> 4;
+ if (stillToGo == 15) stillToGo = get2bytes(bigDataFile) + 16l;
+ else stillToGo ++;
+ n &= 15;
+ }
+ zBuffer.tex[y * picWidth + x] = sortback[n] * 16;
+ stillToGo --;
+ }
+ }
+ finishAccess();
+#endif
+ setResourceForFatal(-1);
+#if 0
+ if (! zBuffer.texName) glGenTextures(1, &zBuffer.texName);
+ glBindTexture(GL_TEXTURE_2D, zBuffer.texName);
+ 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_ALPHA, picWidth, picHeight, 0, GL_ALPHA, GL_UNSIGNED_BYTE, zBuffer.tex, zBuffer.texName);
+#endif
+ return true;
+}
+
+void drawZBuffer(int x, int y, bool upsidedown) {
+ int i;
+#if 0
+ if (! zBuffer.tex) return;
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_BLEND);
+ glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
+ glDepthMask(GL_TRUE);
+
+ glUseProgram(shader.texture);
+
+ setPMVMatrix(shader.texture);
+
+ //glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glBindTexture(GL_TEXTURE_2D, zBuffer.texName);
+
+ setPrimaryColor(1.0, 1.0, 1.0, 1.0);
+
+ for (i = 1; i < zBuffer.numPanels; i++) {
+ GLfloat z = 1.0 - (double) i * (1.0 / 128.0);
+
+ GLfloat vy1 = -y, vy2 = zBuffer.height - y;
+ if (upsidedown) {
+ vy1 += zBuffer.height;
+ vy2 -= zBuffer.height;
+ }
+
+ const GLfloat vertices[] = {
+ (GLfloat) - x, vy1, z,
+ (GLfloat)zBuffer.width - x, vy1, z,
+ (GLfloat) - x, vy2, z,
+ (GLfloat)zBuffer.width - x, vy2, z
+ };
+
+ const GLfloat texCoords[] = {
+ 0.0f, 0.0f,
+ backdropTexW, 0.0f,
+ 0.0f, backdropTexH,
+ backdropTexW, backdropTexH
+ };
+
+ glUniform1i(glGetUniformLocation(shader.texture, "zBuffer"), 1);
+ glUniform1f(glGetUniformLocation(shader.texture, "zBufferLayer"), i);
+
+ drawQuad(shader.texture, vertices, 1, texCoords);
+ glUniform1i(glGetUniformLocation(shader.texture, "zBuffer"), 0);
+ }
+
+ glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
+ glDepthMask(GL_FALSE);
+ glDisable(GL_BLEND);
+ glUseProgram(0);
+#endif
+}
+