From 25ea38c3bc7da9142a330cd97a5fa49f52d6a8a1 Mon Sep 17 00:00:00 2001 From: Gunnar Birke Date: Wed, 15 Jul 2020 16:28:44 +0200 Subject: [PATCH] WINTERMUTE: Implement fog --- engines/wintermute/ad/ad_game.cpp | 13 +++++++ engines/wintermute/ad/ad_game.h | 2 ++ engines/wintermute/ad/ad_scene.cpp | 35 +++++++++++++++++++ engines/wintermute/ad/ad_scene.h | 5 +++ engines/wintermute/base/base_game.cpp | 5 +++ engines/wintermute/base/base_game.h | 2 ++ .../base/gfx/opengl/base_render_opengl3d.cpp | 19 ++++++++++ 7 files changed, 81 insertions(+) diff --git a/engines/wintermute/ad/ad_game.cpp b/engines/wintermute/ad/ad_game.cpp index 4d4c1496ced..2b19c7e5174 100644 --- a/engines/wintermute/ad/ad_game.cpp +++ b/engines/wintermute/ad/ad_game.cpp @@ -1697,6 +1697,19 @@ Wintermute::TShadowType Wintermute::AdGame::getMaxShadowType(Wintermute::BaseObj return MIN(ret, _scene->_maxShadowType); } + +bool Wintermute::AdGame::getFogParams(bool *fogEnabled, uint32 *fogColor, float *fogStart, float *fogEnd) { + if (_scene) { + *fogEnabled = _scene->_fogEnabled; + *fogColor = _scene->_fogColor; + *fogStart = _scene->_fogStart; + *fogEnd = _scene->_fogEnd; + + return true; + } else { + return BaseGame::getFogParams(fogEnabled, fogColor, fogStart, fogEnd); + } +} #endif diff --git a/engines/wintermute/ad/ad_game.h b/engines/wintermute/ad/ad_game.h index c57c5a34563..60231faa517 100644 --- a/engines/wintermute/ad/ad_game.h +++ b/engines/wintermute/ad/ad_game.h @@ -97,6 +97,8 @@ public: uint32 getAmbientLightColor() override; TShadowType getMaxShadowType(BaseObject *object) override; + + bool getFogParams(bool *fogEnabled, uint32 *fogColor, float *fogStart, float *fogEnd) override; #endif bool getVersion(byte *verMajor, byte *verMinor, byte *extMajor, byte *extMinor) const override; diff --git a/engines/wintermute/ad/ad_scene.cpp b/engines/wintermute/ad/ad_scene.cpp index 4b8c47bcb49..abdf47a4c4e 100644 --- a/engines/wintermute/ad/ad_scene.cpp +++ b/engines/wintermute/ad/ad_scene.cpp @@ -105,6 +105,11 @@ void AdScene::setDefaults() { _maxShadowType = SHADOW_FLAT; _ambientLightColor = 0x00000000; + + _fogEnabled = false; + _fogColor = 0x00FFFFFF; + _fogStart = 0.0f; + _fogEnd = 0.0f; #endif _pfPointsNum = 0; @@ -2083,6 +2088,31 @@ bool AdScene::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack, stack->pushBool(false); return STATUS_OK; } + + ////////////////////////////////////////////////////////////////////////// + // EnableFog + ////////////////////////////////////////////////////////////////////////// + else if (strcmp(name, "EnableFog") == 0) { + stack->correctParams(3); + _fogEnabled = true; + _fogColor = stack->pop()->getInt(); + _fogStart = stack->pop()->getFloat(); + _fogEnd = stack->pop()->getFloat(); + + stack->pushNULL(); + return STATUS_OK; + } + + ////////////////////////////////////////////////////////////////////////// + // DisableFog + ////////////////////////////////////////////////////////////////////////// + else if (strcmp(name, "DisableFog") == 0) { + stack->correctParams(0); + _fogEnabled = false; + + stack->pushNULL(); + return STATUS_OK; + } #endif ////////////////////////////////////////////////////////////////////////// @@ -2915,8 +2945,13 @@ bool AdScene::persist(BasePersistenceManager *persistMgr) { persistMgr->transferFloat(TMEMBER(_farPlane)); persistMgr->transferSint32(TMEMBER_INT(_maxShadowType)); persistMgr->transferUint32(TMEMBER(_ambientLightColor)); + persistMgr->transferBool(TMEMBER(_fogEnabled)); + persistMgr->transferUint32(TMEMBER(_fogColor)); + persistMgr->transferFloat(TMEMBER(_fogStart)); + persistMgr->transferFloat(TMEMBER(_fogEnd)); } else { _sceneGeometry = nullptr; + _fogEnabled = false; } #endif diff --git a/engines/wintermute/ad/ad_scene.h b/engines/wintermute/ad/ad_scene.h index 891a6a7ddde..32cd0e46165 100644 --- a/engines/wintermute/ad/ad_scene.h +++ b/engines/wintermute/ad/ad_scene.h @@ -67,6 +67,11 @@ public: float _fov; float _nearPlane; float _farPlane; + + bool _fogEnabled; + uint32 _fogColor; + float _fogStart; + float _fogEnd; #endif bool afterLoad(); diff --git a/engines/wintermute/base/base_game.cpp b/engines/wintermute/base/base_game.cpp index dd1dabd0500..93346aa8117 100644 --- a/engines/wintermute/base/base_game.cpp +++ b/engines/wintermute/base/base_game.cpp @@ -610,6 +610,11 @@ TShadowType BaseGame::getMaxShadowType(BaseObject *object) { uint32 BaseGame::getAmbientLightColor() { return 0x00000000; } + +bool BaseGame::getFogParams(bool *fogEnabled, uint32 *fogColor, float *fogStart, float *fogEnd) { + *fogEnabled = false; + return true; +} #endif ////////////////////////////////////////////////////////////////////////// diff --git a/engines/wintermute/base/base_game.h b/engines/wintermute/base/base_game.h index eeb3900b66f..947c863603d 100644 --- a/engines/wintermute/base/base_game.h +++ b/engines/wintermute/base/base_game.h @@ -169,6 +169,8 @@ public: virtual TShadowType getMaxShadowType(BaseObject *object); virtual uint32 getAmbientLightColor(); + + virtual bool getFogParams(bool *fogEnabled, uint32 *fogColor, float *fogStart, float *fogEnd); #endif BaseSoundMgr *_soundMgr; #if EXTENDED_DEBUGGER_ENABLED diff --git a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp index cc52947f2b6..ee49ef186dd 100644 --- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp +++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp @@ -383,6 +383,25 @@ bool BaseRenderOpenGL3D::setup3D(Camera3D *camera, bool force) { glGetFloatv(GL_MODELVIEW_MATRIX, _lastViewMatrix.getData()); } + bool fogEnabled; + uint32 fogColor; + float fogStart; + float fogEnd; + + _gameRef->getFogParams(&fogEnabled, &fogColor, &fogStart, &fogEnd); + + if (fogEnabled) { + glEnable(GL_FOG); + glFogi(GL_FOG_MODE, GL_LINEAR); + glFogf(GL_FOG_START, fogStart); + glFogf(GL_FOG_END, fogEnd); + + GLfloat color[4] = { RGBCOLGetR(fogColor) / 255.0f, RGBCOLGetG(fogColor) / 255.0f, RGBCOLGetB(fogColor) / 255.0f, RGBCOLGetA(fogColor) / 255.0f }; + glFogfv(GL_FOG_COLOR, color); + } else { + glDisable(GL_FOG); + } + setProjection(); }