[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