diff options
Diffstat (limited to 'engines/sludge/graphics.cpp')
-rw-r--r-- | engines/sludge/graphics.cpp | 143 |
1 files changed, 142 insertions, 1 deletions
diff --git a/engines/sludge/graphics.cpp b/engines/sludge/graphics.cpp index 93295b4f66..81e8ed2ed6 100644 --- a/engines/sludge/graphics.cpp +++ b/engines/sludge/graphics.cpp @@ -20,18 +20,117 @@ * */ +#include "engines/util.h" + #include "sludge/backdrop.h" +#include "sludge/freeze.h" #include "sludge/graphics.h" +#include "sludge/newfatal.h" +#include "sludge/sludge.h" +#include "sludge/sludger.h" +#include "sludge/sprites.h" +#include "sludge/zbuffer.h" namespace Sludge { -GraphicsManager::GraphicsManager() { +extern inputType input; + +GraphicsManager::GraphicsManager(SludgeEngine *vm) { + _vm = vm; + + // Init screen surface + _winWidth = _sceneWidth = 640; + _winHeight = _sceneHeight = 480; + + // LightMap + _lightMapMode = LIGHTMAPMODE_PIXEL; + _lightMapNumber = 0; + + // Parallax _parallaxStuff = new Parallax; + + // Camera + _cameraZoom = 1.0; + _cameraX = _cameraY = 0; + + // Freeze + _frozenStuff = nullptr; + + // Back drop + _backdropExists = false; + + // Sprites + _spriteLayers = new SpriteLayers; + _spriteLayers->numLayers = 0; + + // ZBuffer + _zBufferToSet = -1; + _zBuffer = new ZBufferData; + _zBuffer->sprites = nullptr; + + // Colors + _currentBlankColour = _renderSurface.format.ARGBToColor(255, 0, 0, 0); + _currentBurnR = 0; + _currentBurnG = 0; + _currentBurnB = 0; } GraphicsManager::~GraphicsManager() { + // kill parallax + killParallax(); delete _parallaxStuff; _parallaxStuff = nullptr; + + // kill frozen stuff + FrozenStuffStruct *killMe = _frozenStuff; + while (killMe) { + _frozenStuff = _frozenStuff->next; + if (killMe->backdropSurface.getPixels()) + killMe->backdropSurface.free(); + if (killMe->lightMapSurface.getPixels()) + killMe->lightMapSurface.free(); + delete killMe; + killMe = nullptr; + killMe = _frozenStuff; + } + + // kill sprite layers + killSpriteLayers(); + delete _spriteLayers; + _spriteLayers = nullptr; + + // kill zbuffer + killZBuffer(); + delete _zBuffer; + _zBuffer = nullptr; + + // kill surfaces + if (_renderSurface.getPixels()) + _renderSurface.free(); + + if (_snapshotSurface.getPixels()) + _snapshotSurface.free(); + + if (_backdropSurface.getPixels()) + _backdropSurface.free(); + + if (_origBackdropSurface.getPixels()) + _origBackdropSurface.free(); +} + +bool GraphicsManager::init() { + initGraphics(_winWidth, _winHeight, true, _vm->getScreenPixelFormat()); + _renderSurface.create(_winWidth, _winHeight, *_vm->getScreenPixelFormat()); + + if (!killResizeBackdrop(_winWidth, _winHeight)) + return fatal("Couldn't allocate memory for backdrop"); + + return true; +} + +void GraphicsManager::display() { + g_system->copyRectToScreen((byte *)_renderSurface.getPixels(), _renderSurface.pitch, 0, 0, _renderSurface.w, _renderSurface.h); + g_system->updateScreen(); } bool GraphicsManager::loadParallax(uint16 v, uint16 fracX, uint16 fracY) { @@ -56,6 +155,48 @@ void GraphicsManager::drawParallax() { _parallaxStuff->draw(); } +void GraphicsManager::aimCamera(int cameraX, int cameraY) { + _cameraX = cameraX; + _cameraY = cameraY; + _cameraX -= (float)(_winWidth >> 1) / _cameraZoom; + _cameraY -= (float)(_winHeight >> 1) / _cameraZoom; + + if (_cameraX < 0) + _cameraX = 0; + else if (_cameraX > _sceneWidth - (float)_winWidth / _cameraZoom) + _cameraX = _sceneWidth - (float)_winWidth / _cameraZoom; + if (_cameraY < 0) + _cameraY = 0; + else if (_cameraY > _sceneHeight - (float)_winHeight / _cameraZoom) + _cameraY = _sceneHeight - (float)_winHeight / _cameraZoom; +} + +void GraphicsManager::zoomCamera(int z) { + input.mouseX = input.mouseX * _cameraZoom; + input.mouseY = input.mouseY * _cameraZoom; + + _cameraZoom = (float)z * 0.01; + if ((float)_winWidth / _cameraZoom > _sceneWidth) + _cameraZoom = (float)_winWidth / _sceneWidth; + if ((float)_winHeight / _cameraZoom > _sceneHeight) + _cameraZoom = (float)_winHeight / _sceneHeight; + + input.mouseX = input.mouseX / _cameraZoom; + input.mouseY = input.mouseY / _cameraZoom; +} + +void GraphicsManager::saveColors(Common::WriteStream *stream) { + stream->writeUint16BE(_currentBlankColour); + stream->writeByte(_currentBurnR); + stream->writeByte(_currentBurnG); + stream->writeByte(_currentBurnB); +} +void GraphicsManager::loadColors(Common::SeekableReadStream *stream) { + _currentBlankColour = stream->readUint16BE(); + _currentBurnR = stream->readByte(); + _currentBurnG = stream->readByte(); + _currentBurnB = stream->readByte(); +} } // End of namespace Sludge |