From 219044abf9841461043d6e2acf0d5a48a7c7648b Mon Sep 17 00:00:00 2001 From: yinsimei Date: Fri, 26 May 2017 05:24:38 +0200 Subject: SLUDGE: Add sludge files and make it compile --- engines/sludge/zbuffer.cpp | 205 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 205 insertions(+) create mode 100644 engines/sludge/zbuffer.cpp (limited to 'engines/sludge/zbuffer.cpp') 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 +} + -- cgit v1.2.3