aboutsummaryrefslogtreecommitdiff
path: root/engines/sludge/graphics.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sludge/graphics.cpp')
-rw-r--r--engines/sludge/graphics.cpp143
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