mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-28 04:34:50 +00:00
372 lines
9.9 KiB
C++
372 lines
9.9 KiB
C++
/* 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 "allfiles.h"
|
|
#include "debug.h"
|
|
#include "graphics.h"
|
|
#include "newfatal.h"
|
|
#include "sprites.h"
|
|
#include "sprbanks.h"
|
|
#include "people.h"
|
|
#include "sludger.h"
|
|
#include "objtypes.h"
|
|
#include "region.h"
|
|
#include "backdrop.h"
|
|
#include "talk.h"
|
|
#include "fonttext.h"
|
|
#include "statusba.h"
|
|
#include "freeze.h"
|
|
#include "zbuffer.h"
|
|
|
|
namespace Sludge {
|
|
|
|
extern onScreenPerson *allPeople;
|
|
extern screenRegion *allScreenRegions;
|
|
extern screenRegion *overRegion;
|
|
extern speechStruct *speech;
|
|
extern inputType input;
|
|
#if 0
|
|
extern GLuint backdropTextureName;
|
|
#endif
|
|
extern parallaxLayer *parallaxStuff;
|
|
extern int lightMapNumber, zBufferNumber;
|
|
extern eventHandlers *currentEvents;
|
|
extern personaAnimation *mouseCursorAnim;
|
|
extern int mouseCursorFrameNum;
|
|
extern int cameraX, cameraY;
|
|
extern unsigned int sceneWidth, sceneHeight;
|
|
extern float cameraZoom;
|
|
extern zBufferData zBuffer;
|
|
extern bool backdropExists;
|
|
frozenStuffStruct *frozenStuff = NULL;
|
|
extern unsigned int sceneWidth, sceneHeight;
|
|
|
|
void shufflePeople();
|
|
#if 0
|
|
GLuint freezeTextureName = 0;
|
|
#endif
|
|
|
|
void freezeGraphics() {
|
|
#if 0
|
|
glViewport(0, 0, realWinWidth, realWinHeight);
|
|
|
|
glGenTextures(1, &freezeTextureName);
|
|
#endif
|
|
int w = winWidth;
|
|
int h = winHeight;
|
|
if (!NPOT_textures) {
|
|
w = getNextPOT(winWidth);
|
|
h = getNextPOT(winHeight);
|
|
}
|
|
#if 0
|
|
glBindTexture(GL_TEXTURE_2D, freezeTextureName);
|
|
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, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, freezeTextureName);
|
|
#endif
|
|
// Temporarily disable AA
|
|
int antiAlias = gameSettings.antiAlias;
|
|
gameSettings.antiAlias = 0;
|
|
|
|
int x = 0;
|
|
while (x < winWidth) {
|
|
int y = 0;
|
|
|
|
if (winWidth - x < realWinWidth) {
|
|
w = winWidth - x;
|
|
} else {
|
|
w = realWinWidth;
|
|
}
|
|
|
|
while (y < winHeight) {
|
|
|
|
if (winHeight - y < realWinHeight) {
|
|
h = winHeight - y;
|
|
} else {
|
|
h = realWinHeight;
|
|
}
|
|
#if 0
|
|
const GLfloat bPMVMatrix[] = {
|
|
2.0f / realWinWidth * cameraZoom, .0, .0, .0,
|
|
.0, 2.0f / realWinHeight * cameraZoom, .0, .0,
|
|
.0, .0, 1.0f, .0,
|
|
-2.0f * (x / realWinWidth) - 1.0f, -2.0f * (y / realWinHeight) - 1.0f, .0, 1.0f
|
|
|
|
};
|
|
for (int i = 0; i < 16; i++) {
|
|
aPMVMatrix[i] = bPMVMatrix[i];
|
|
}
|
|
// Render scene
|
|
glDepthMask(GL_TRUE);
|
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// Clear The Screen
|
|
glDepthMask(GL_FALSE);
|
|
|
|
drawBackDrop();// Draw the room
|
|
drawZBuffer(cameraX, cameraY, false);
|
|
|
|
glEnable(GL_DEPTH_TEST);
|
|
|
|
drawPeople();// Then add any moving characters...
|
|
|
|
glDisable(GL_DEPTH_TEST);
|
|
|
|
// Copy Our ViewPort To The Texture
|
|
copyTexSubImage2D(GL_TEXTURE_2D, 0, x, y, 0, 0, w, h, freezeTextureName);
|
|
#endif
|
|
y += h;
|
|
}
|
|
x += w;
|
|
}
|
|
|
|
gameSettings.antiAlias = antiAlias;
|
|
|
|
#if 0
|
|
glViewport(viewportOffsetX, viewportOffsetY, viewportWidth, viewportHeight);
|
|
setPixelCoords(false);
|
|
#endif
|
|
}
|
|
|
|
bool freeze() {
|
|
debugOut("calling freeze()\n");
|
|
frozenStuffStruct *newFreezer = new frozenStuffStruct;
|
|
if (!checkNew(newFreezer))
|
|
return false;
|
|
|
|
// Grab a copy of the current scene
|
|
freezeGraphics();
|
|
#if 0
|
|
newFreezer -> backdropTextureName = backdropTextureName;
|
|
#endif
|
|
int picWidth = sceneWidth;
|
|
int picHeight = sceneHeight;
|
|
if (!NPOT_textures) {
|
|
picWidth = getNextPOT(picWidth);
|
|
picHeight = getNextPOT(picHeight);
|
|
}
|
|
#if 0
|
|
newFreezer -> backdropTexture = new GLubyte [picHeight * picWidth * 4];
|
|
if (! checkNew(newFreezer -> backdropTexture)) return false;
|
|
|
|
saveTexture(backdropTextureName, newFreezer->backdropTexture);
|
|
|
|
backdropTextureName = 0;
|
|
#endif
|
|
newFreezer->sceneWidth = sceneWidth;
|
|
newFreezer->sceneHeight = sceneHeight;
|
|
newFreezer->cameraX = cameraX;
|
|
newFreezer->cameraY = cameraY;
|
|
newFreezer->cameraZoom = cameraZoom;
|
|
#if 0
|
|
newFreezer -> lightMapTexture = lightMap.data;
|
|
newFreezer -> lightMapTextureName = lightMap.name;
|
|
newFreezer -> lightMapNumber = lightMapNumber;
|
|
lightMap.data = NULL;
|
|
lightMap.name = 0;
|
|
newFreezer -> parallaxStuff = parallaxStuff;
|
|
parallaxStuff = NULL;
|
|
newFreezer -> zBufferImage = zBuffer.tex;
|
|
newFreezer -> zBufferNumber = zBuffer.originalNum;
|
|
newFreezer -> zPanels = zBuffer.numPanels;
|
|
zBuffer.tex = NULL;
|
|
#endif
|
|
// resizeBackdrop kills parallax stuff, light map, z-buffer...
|
|
if (!killResizeBackdrop(winWidth, winHeight))
|
|
return fatal("Can't create new temporary backdrop buffer");
|
|
|
|
if (!NPOT_textures) {
|
|
picWidth = getNextPOT(sceneWidth);
|
|
picHeight = getNextPOT(sceneHeight);
|
|
#if 0
|
|
backdropTexW = (double) sceneWidth / picWidth;
|
|
backdropTexH = (double) sceneHeight / picHeight;
|
|
#endif
|
|
}
|
|
|
|
#if 0
|
|
// Copy the old scene to the new backdrop
|
|
deleteTextures(1, &backdropTextureName);
|
|
backdropTextureName = freezeTextureName;
|
|
backdropExists = true;
|
|
|
|
// Free texture memory used by old stuff
|
|
parallaxStuff = newFreezer -> parallaxStuff;
|
|
while (parallaxStuff) {
|
|
deleteTextures(1, ¶llaxStuff -> textureName);
|
|
parallaxStuff = parallaxStuff -> next;
|
|
}
|
|
if (newFreezer -> zBufferImage) {
|
|
deleteTextures(1, &zBuffer.texName);
|
|
}
|
|
if (newFreezer -> lightMapTextureName) {
|
|
deleteTextures(1, &newFreezer -> lightMapTextureName);
|
|
}
|
|
if (newFreezer -> backdropTextureName) {
|
|
deleteTextures(1, &newFreezer -> backdropTextureName);
|
|
}
|
|
#endif
|
|
newFreezer->allPeople = allPeople;
|
|
allPeople = NULL;
|
|
|
|
statusStuff *newStatusStuff = new statusStuff;
|
|
if (!checkNew(newStatusStuff))
|
|
return false;
|
|
newFreezer->frozenStatus = copyStatusBarStuff(newStatusStuff);
|
|
|
|
newFreezer->allScreenRegions = allScreenRegions;
|
|
allScreenRegions = NULL;
|
|
overRegion = NULL;
|
|
|
|
newFreezer->mouseCursorAnim = mouseCursorAnim;
|
|
newFreezer->mouseCursorFrameNum = mouseCursorFrameNum;
|
|
mouseCursorAnim = makeNullAnim();
|
|
mouseCursorFrameNum = 0;
|
|
|
|
newFreezer->speech = speech;
|
|
initSpeech();
|
|
|
|
newFreezer->currentEvents = currentEvents;
|
|
currentEvents = new eventHandlers;
|
|
if (!checkNew(currentEvents))
|
|
return false;
|
|
memset(currentEvents, 0, sizeof(eventHandlers));
|
|
|
|
newFreezer->next = frozenStuff;
|
|
frozenStuff = newFreezer;
|
|
|
|
return true;
|
|
}
|
|
|
|
int howFrozen() {
|
|
int a = 0;
|
|
frozenStuffStruct *f = frozenStuff;
|
|
while (f) {
|
|
a++;
|
|
f = f->next;
|
|
}
|
|
return a;
|
|
}
|
|
|
|
#if 0
|
|
extern GLubyte *backdropTexture;
|
|
#endif
|
|
|
|
void unfreeze(bool killImage) {
|
|
frozenStuffStruct *killMe = frozenStuff;
|
|
|
|
if (!frozenStuff)
|
|
return;
|
|
|
|
sceneWidth = frozenStuff->sceneWidth;
|
|
sceneHeight = frozenStuff->sceneHeight;
|
|
|
|
cameraX = frozenStuff->cameraX;
|
|
cameraY = frozenStuff->cameraY;
|
|
input.mouseX = (int) (input.mouseX * cameraZoom);
|
|
input.mouseY = (int) (input.mouseY * cameraZoom);
|
|
cameraZoom = frozenStuff->cameraZoom;
|
|
input.mouseX = (int) (input.mouseX / cameraZoom);
|
|
input.mouseY = (int) (input.mouseY / cameraZoom);
|
|
setPixelCoords(false);
|
|
|
|
killAllPeople();
|
|
allPeople = frozenStuff->allPeople;
|
|
|
|
killAllRegions();
|
|
allScreenRegions = frozenStuff->allScreenRegions;
|
|
|
|
killLightMap();
|
|
#if 0
|
|
lightMap.data = frozenStuff -> lightMapTexture;
|
|
lightMap.name = frozenStuff -> lightMapTextureName;
|
|
lightMapNumber = frozenStuff -> lightMapNumber;
|
|
if (lightMapNumber) {
|
|
lightMap.name = 0;
|
|
loadLightMap(lightMapNumber);
|
|
}
|
|
|
|
killZBuffer();
|
|
zBuffer.tex = frozenStuff -> zBufferImage;
|
|
zBuffer.originalNum = frozenStuff -> zBufferNumber;
|
|
zBuffer.numPanels = frozenStuff -> zPanels;
|
|
if (zBuffer.numPanels) {
|
|
zBuffer.texName = 0;
|
|
setZBuffer(zBuffer.originalNum);
|
|
}
|
|
|
|
killParallax();
|
|
parallaxStuff = frozenStuff -> parallaxStuff;
|
|
reloadParallaxTextures();
|
|
|
|
if (killImage) killBackDrop();
|
|
backdropTextureName = frozenStuff -> backdropTextureName;
|
|
if (backdropTexture) delete[] backdropTexture;
|
|
backdropTexture = frozenStuff -> backdropTexture;
|
|
backdropExists = true;
|
|
if (backdropTextureName) {
|
|
backdropTextureName = 0;
|
|
glGenTextures(1, &backdropTextureName);
|
|
glBindTexture(GL_TEXTURE_2D, backdropTextureName);
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
|
|
|
if (gameSettings.antiAlias < 0) {
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
} else {
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
|
}
|
|
|
|
int picWidth = sceneWidth;
|
|
int picHeight = sceneHeight;
|
|
if (! NPOT_textures) {
|
|
picWidth = getNextPOT(picWidth);
|
|
picHeight = getNextPOT(picHeight);
|
|
}
|
|
// Restore the backdrop
|
|
texImage2D(GL_TEXTURE_2D, 0, GL_RGBA, picWidth, picHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, frozenStuff -> backdropTexture, backdropTextureName);
|
|
}
|
|
#endif
|
|
deleteAnim(mouseCursorAnim);
|
|
mouseCursorAnim = frozenStuff->mouseCursorAnim;
|
|
mouseCursorFrameNum = frozenStuff->mouseCursorFrameNum;
|
|
|
|
restoreBarStuff(frozenStuff->frozenStatus);
|
|
|
|
delete currentEvents;
|
|
currentEvents = frozenStuff->currentEvents;
|
|
killAllSpeech();
|
|
delete speech;
|
|
|
|
speech = frozenStuff->speech;
|
|
frozenStuff = frozenStuff->next;
|
|
|
|
overRegion = NULL;
|
|
delete killMe;
|
|
killMe = NULL;
|
|
|
|
}
|
|
|
|
} // End of namespace Sludge
|