[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