[Scummvm-git-logs] scummvm master -> d411edccbf69bfb1d14305138da16d91d1a6eafc
aquadran
noreply at scummvm.org
Sun Nov 17 20:50:07 UTC 2024
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
d411edccbf WINTERMUTE: Partially implemented ShadowManager plugin
Commit: d411edccbf69bfb1d14305138da16d91d1a6eafc
https://github.com/scummvm/scummvm/commit/d411edccbf69bfb1d14305138da16d91d1a6eafc
Author: PaweÅ KoÅodziejski (aquadran at gmail.com)
Date: 2024-11-17T21:50:02+01:00
Commit Message:
WINTERMUTE: Partially implemented ShadowManager plugin
Changed paths:
engines/wintermute/ext/wme_shadowmanager.cpp
engines/wintermute/ext/wme_shadowmanager.h
diff --git a/engines/wintermute/ext/wme_shadowmanager.cpp b/engines/wintermute/ext/wme_shadowmanager.cpp
index cf7a5b926b6..6c1ba3dd93e 100644
--- a/engines/wintermute/ext/wme_shadowmanager.cpp
+++ b/engines/wintermute/ext/wme_shadowmanager.cpp
@@ -25,6 +25,7 @@
#include "engines/wintermute/base/base_engine.h"
#include "engines/wintermute/base/scriptables/script_stack.h"
#include "engines/wintermute/base/scriptables/script_value.h"
+#include "engines/wintermute/ad/ad_object.h"
#include "engines/wintermute/ext/wme_shadowmanager.h"
#include "engines/wintermute/ext/plugin_event.h"
@@ -51,6 +52,7 @@ SXShadowManager::SXShadowManager(BaseGame *inGame, ScStack *stack) : BaseScripta
_minShadow = 0.1f;
_maxShadow = 1.0f;
_useSmartShadows = false;
+ _shadowColor = 0x80000000;
}
//////////////////////////////////////////////////////////////////////////
@@ -99,9 +101,11 @@ bool SXShadowManager::scCallMethod(ScScript *script, ScStack *stack, ScStack *th
//////////////////////////////////////////////////////////////////////////
if (strcmp(name, "AddActor") == 0) {
stack->correctParams(1);
- const char *actorName = stack->pop()->getString();
- stack->pushBool(addActor(actorName));
+ AdObject *actorObj = (AdObject *)stack->pop()->getNative();
+ if (actorObj) {
+ stack->pushBool(addActor(actorObj));
+ }
return STATUS_OK;
}
@@ -264,8 +268,6 @@ ScValue *SXShadowManager::scGetProperty(const Common::String &name) {
//////////////////////////////////////////////////////////////////////////
bool SXShadowManager::scSetProperty(const char *name, ScValue *value) {
- // DefaultLightPos, DefaultLightPosX, DefaultLightPosY, DefaultLightPosZ, MinShadow, MaxShadow, UseSmartShadows
-
//////////////////////////////////////////////////////////////////////////
// DefaultLightPos
//////////////////////////////////////////////////////////////////////////
@@ -339,8 +341,14 @@ bool SXShadowManager::persist(BasePersistenceManager *persistMgr) {
event._plugin = this
};
_gameRef->pluginEvents().subscribeEvent(event);
+#ifdef ENABLE_WME3D
+ _actors.clear();
+ // Actor list is not get restored, plugin is not design work this way.
+ // List get refreshed by game script on scene change.
+#endif
}
+ persistMgr->transferUint32(TMEMBER(_lastTime));
persistMgr->transferVector3d(TMEMBER(_defaultLightPos));
persistMgr->transferFloat(TMEMBER(_minShadow));
persistMgr->transferFloat(TMEMBER(_maxShadow));
@@ -360,19 +368,44 @@ void SXShadowManager::callback(void *eventData1, void *eventData2) {
}
void SXShadowManager::update() {
+#ifdef ENABLE_WME3D
+ if (_useSmartShadows) {
+ // TODO: value should be calculated, but for now it's a const
+ _shadowColor = 0x66000000;
+ for (auto it = _actors.begin(); it != _actors.end(); ++it) {
+ it->first->_shadowLightPos = _defaultLightPos;
+ it->first->_shadowColor = _shadowColor;
+ }
+ }
+#endif
}
void SXShadowManager::run() {
+ _lastTime = _gameRef->scGetProperty("CurrentTime")->getInt();
}
void SXShadowManager::stop() {
}
-bool SXShadowManager::addActor(const char *actorName) {
+bool SXShadowManager::addActor(AdObject *actorObj) {
+#ifdef ENABLE_WME3D
+ if (_useSmartShadows) {
+ if (strcmp(actorObj->scGetProperty("Type")->getString(), "actor3dx") == 0) {
+ AdActor3DX *actor = (AdActor3DX *)actorObj;
+ _actors.push_back(Common::Pair<AdActor3DX *, uint32>(actor, actor->_shadowColor));
+ }
+ }
+#endif
return true;
}
bool SXShadowManager::removeAllActors() {
+#ifdef ENABLE_WME3D
+ for (auto it = _actors.begin(); it != _actors.end(); ++it) {
+ it->first->_shadowColor = it->second;
+ _actors.erase(it);
+ }
+#endif
return true;
}
diff --git a/engines/wintermute/ext/wme_shadowmanager.h b/engines/wintermute/ext/wme_shadowmanager.h
index a037b817739..fc6606e8322 100644
--- a/engines/wintermute/ext/wme_shadowmanager.h
+++ b/engines/wintermute/ext/wme_shadowmanager.h
@@ -26,6 +26,10 @@
#include "engines/wintermute/base/base_scriptable.h"
+#ifdef ENABLE_WME3D
+#include "engines/wintermute/ad/ad_actor_3dx.h"
+#endif
+
namespace Wintermute {
class SXShadowManager : public BaseScriptable {
@@ -43,16 +47,20 @@ private:
void update();
void run();
void stop();
- bool addActor(const char *actorName);
+ bool addActor(AdObject *actorObj);
bool removeAllActors();
bool enableLight(const char *lightName);
bool disableLight(const char *lightName);
- int _lastTime{};
+#ifdef ENABLE_WME3D
+ Common::List<Common::Pair<AdActor3DX *, uint32>> _actors;
+#endif
+ uint32 _lastTime{};
DXVector3 _defaultLightPos;
float _minShadow;
float _maxShadow;
bool _useSmartShadows;
+ uint32 _shadowColor;
};
} // End of namespace Wintermute
More information about the Scummvm-git-logs
mailing list