[Scummvm-git-logs] scummvm master -> 7c7bc429f6c27815b936d290cf56e4e739b0f2cb

elasota noreply at scummvm.org
Sun Jun 26 01:57:44 UTC 2022


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:
7c7bc429f6 MTROPOLIS: More accurate handling of graphic modifier removal


Commit: 7c7bc429f6c27815b936d290cf56e4e739b0f2cb
    https://github.com/scummvm/scummvm/commit/7c7bc429f6c27815b936d290cf56e4e739b0f2cb
Author: elasota (ejlasota at gmail.com)
Date: 2022-06-25T21:57:17-04:00

Commit Message:
MTROPOLIS: More accurate handling of graphic modifier removal

Changed paths:
    engines/mtropolis/elements.cpp
    engines/mtropolis/modifiers.cpp
    engines/mtropolis/plugin/obsidian.cpp
    engines/mtropolis/runtime.cpp
    engines/mtropolis/runtime.h


diff --git a/engines/mtropolis/elements.cpp b/engines/mtropolis/elements.cpp
index ed469ff55bf..79e10f50a0a 100644
--- a/engines/mtropolis/elements.cpp
+++ b/engines/mtropolis/elements.cpp
@@ -1115,12 +1115,15 @@ void ImageElement::deactivate() {
 
 void ImageElement::render(Window *window) {
 	if (_cachedImage) {
+		VisualElementRenderProperties::InkMode inkMode = _renderProps.getInkMode();
+
+		if (inkMode == VisualElementRenderProperties::kInkModeInvisible)
+			return;
+
 		Common::SharedPtr<Graphics::Surface> optimized = _cachedImage->optimize(_runtime);
 		Common::Rect srcRect(optimized->w, optimized->h);
 		Common::Rect destRect(_cachedAbsoluteOrigin.x, _cachedAbsoluteOrigin.y, _cachedAbsoluteOrigin.x + _rect.width(), _cachedAbsoluteOrigin.y + _rect.height());
 
-		VisualElementRenderProperties::InkMode inkMode = _renderProps.getInkMode();
-
 		if (inkMode == VisualElementRenderProperties::kInkModeBackgroundMatte || inkMode == VisualElementRenderProperties::kInkModeBackgroundTransparent) {
 			const ColorRGB8 transColorRGB8 = _renderProps.getBackColor();
 			uint32 transColor = optimized->format.ARGBToColor(255, transColorRGB8.r, transColorRGB8.g, transColorRGB8.b);
@@ -1269,6 +1272,7 @@ bool MToonElement::canAutoPlay() const {
 
 void MToonElement::render(Window *window) {
 	if (_cachedMToon) {
+
 		_cachedMToon->optimize(_runtime);
 
 		uint32 frame = _cel - 1;
@@ -1278,12 +1282,20 @@ void MToonElement::render(Window *window) {
 
 		_renderedFrame = frame;
 
-		Common::Rect frameRect = _metadata->frames[frame].rect;
+		// This is a bit suboptimal since we don't need to render the frame if invisible, but
+		// we do need some things here to be up to date because isMouseCollisionAtPoint depends on
+		// invisible mToon frames still being clickable.
+		VisualElementRenderProperties::InkMode inkMode = _renderProps.getInkMode();
+
+		if (inkMode == VisualElementRenderProperties::kInkModeInvisible)
+			return;
 
 		if (_renderSurface) {
 			Common::Rect srcRect;
 			Common::Rect destRect;
 
+			Common::Rect frameRect = _metadata->frames[frame].rect;
+
 			if (frameRect.width() == _renderSurface->w && frameRect.height() == _renderSurface->h) {
 				// Frame rect is the size of the render surface, meaning the frame rect is an offset
 				srcRect = Common::Rect(0, 0, frameRect.width(), frameRect.height());
@@ -1293,7 +1305,6 @@ void MToonElement::render(Window *window) {
 			}
 			destRect = Common::Rect(_cachedAbsoluteOrigin.x + frameRect.left, _cachedAbsoluteOrigin.y + frameRect.top, _cachedAbsoluteOrigin.x + frameRect.right, _cachedAbsoluteOrigin.y + frameRect.bottom);
 
-			VisualElementRenderProperties::InkMode inkMode = _renderProps.getInkMode();
 			if (inkMode == VisualElementRenderProperties::kInkModeBackgroundMatte || inkMode == VisualElementRenderProperties::kInkModeBackgroundTransparent) {
 				ColorRGB8 transColorRGB8 = _renderProps.getBackColor();
 				uint32 transColor = _renderSurface->format.ARGBToColor(255, transColorRGB8.r, transColorRGB8.g, transColorRGB8.b);
diff --git a/engines/mtropolis/modifiers.cpp b/engines/mtropolis/modifiers.cpp
index 83aeb998049..550dcf019f1 100644
--- a/engines/mtropolis/modifiers.cpp
+++ b/engines/mtropolis/modifiers.cpp
@@ -1612,10 +1612,18 @@ VThreadState GraphicModifier::consumeMessage(Runtime *runtime, const Common::Sha
 	if (!element->isVisual())
 		return kVThreadReturn;
 
-	if (_applyWhen.respondsTo(msg->getEvent()))
-		static_cast<VisualElement *>(element)->setRenderProperties(_renderProps);
-	if (_removeWhen.respondsTo(msg->getEvent()))
-		static_cast<VisualElement *>(element)->setRenderProperties(VisualElementRenderProperties());
+	VisualElement *visual = static_cast<VisualElement *>(element);
+
+	// If a graphic modifier is the active graphic modifier, then it may be removed, but removing it resets to default, not to
+	// any other graphic modifier.  If it is not the active graphic modifier, then removing it has no effect.
+	// This is required for correct rendering of the beaker when freeing Max in Obsidian.
+	if (_applyWhen.respondsTo(msg->getEvent())) {
+		visual->setRenderProperties(_renderProps, this->getSelfReference().staticCast<GraphicModifier>());
+	}
+	if (_removeWhen.respondsTo(msg->getEvent())) {
+		if (visual->getPrimaryGraphicModifier().lock().get() == this)
+			static_cast<VisualElement *>(element)->setRenderProperties(VisualElementRenderProperties(), Common::WeakPtr<GraphicModifier>());
+	}
 
 	return kVThreadReturn;
 }
diff --git a/engines/mtropolis/plugin/obsidian.cpp b/engines/mtropolis/plugin/obsidian.cpp
index 909024968d7..6d6ab0da27f 100644
--- a/engines/mtropolis/plugin/obsidian.cpp
+++ b/engines/mtropolis/plugin/obsidian.cpp
@@ -600,7 +600,7 @@ VThreadState XorModModifier::consumeMessage(Runtime *runtime, const Common::Shar
 	else
 		renderProps.setShape(static_cast<VisualElementRenderProperties::Shape>(VisualElementRenderProperties::kShapeObsidianCanvasPuzzleTri1 + _shapeID - 1));
 
-	visual->setRenderProperties(renderProps);
+	visual->setRenderProperties(renderProps, Common::WeakPtr<GraphicModifier>());
 
 	return kVThreadReturn;
 }
diff --git a/engines/mtropolis/runtime.cpp b/engines/mtropolis/runtime.cpp
index 565cee13ef2..5a4b14dc4e3 100644
--- a/engines/mtropolis/runtime.cpp
+++ b/engines/mtropolis/runtime.cpp
@@ -6989,14 +6989,19 @@ VThreadState VisualElement::offsetTranslateTask(const OffsetTranslateTaskData &d
 	return kVThreadReturn;
 }
 
-void VisualElement::setRenderProperties(const VisualElementRenderProperties &props) {
+void VisualElement::setRenderProperties(const VisualElementRenderProperties &props, const Common::WeakPtr<GraphicModifier> &primaryGraphicModifier) {
 	_renderProps = props;
+	_primaryGraphicModifier = primaryGraphicModifier;
 }
 
 const VisualElementRenderProperties &VisualElement::getRenderProperties() const {
 	return _renderProps;
 }
 
+const Common::WeakPtr<GraphicModifier> &VisualElement::getPrimaryGraphicModifier() const {
+	return _primaryGraphicModifier;
+}
+
 bool VisualElement::needsRender() const {
 	if (_renderProps.isDirty() || _prevRect != _rect || _contentsDirty)
 		return true;
diff --git a/engines/mtropolis/runtime.h b/engines/mtropolis/runtime.h
index 12e983813ef..afcd87efe89 100644
--- a/engines/mtropolis/runtime.h
+++ b/engines/mtropolis/runtime.h
@@ -73,6 +73,7 @@ class AssetManagerInterface;
 class CursorGraphic;
 class CursorGraphicCollection;
 class Element;
+class GraphicModifier;
 class KeyboardInputEvent;
 class MessageDispatch;
 class MiniscriptThread;
@@ -2427,8 +2428,9 @@ public:
 
 	VThreadState offsetTranslateTask(const OffsetTranslateTaskData &data);
 
-	void setRenderProperties(const VisualElementRenderProperties &props);
+	void setRenderProperties(const VisualElementRenderProperties &props, const Common::WeakPtr<GraphicModifier> &primaryGraphicModifier);
 	const VisualElementRenderProperties &getRenderProperties() const;
+	const Common::WeakPtr<GraphicModifier> &getPrimaryGraphicModifier() const;
 
 	bool needsRender() const;
 	virtual void render(Window *window) = 0;
@@ -2477,7 +2479,10 @@ protected:
 
 	Common::SharedPtr<DragMotionProperties> _dragProps;
 
+	// Quirk: When a graphic modifier is applied, it needs to be 
 	VisualElementRenderProperties _renderProps;
+	Common::WeakPtr<GraphicModifier> _primaryGraphicModifier;
+
 	Common::Rect _prevRect;
 	bool _contentsDirty;
 };




More information about the Scummvm-git-logs mailing list