From 0c26f866c43dd92aa4001331f55eaf6ea7f1b11c Mon Sep 17 00:00:00 2001 From: Bottinator22 Date: Wed, 12 Mar 2025 11:16:18 -0700 Subject: head rotation masks --- source/game/StarHumanoid.cpp | 44 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 5 deletions(-) (limited to 'source/game/StarHumanoid.cpp') diff --git a/source/game/StarHumanoid.cpp b/source/game/StarHumanoid.cpp index f3ac164..d8300e5 100644 --- a/source/game/StarHumanoid.cpp +++ b/source/game/StarHumanoid.cpp @@ -288,6 +288,12 @@ void Humanoid::setIdentity(HumanoidIdentity const& identity) { m_backArmFrameset = getBackArmFromIdentity(); m_frontArmFrameset = getFrontArmFromIdentity(); m_vaporTrailFrameset = getVaporTrailFrameset(); + if (m_useBodyMask) { + m_bodyMaskFrameset = getBodyMaskFromIdentity(); + } + if (m_useBodyHeadMask) { + m_bodyHeadMaskFrameset = getBodyHeadMaskFromIdentity(); + } } HumanoidIdentity const& Humanoid::identity() const { @@ -317,6 +323,8 @@ void Humanoid::loadConfig(Json merger) { m_feetOffset = jsonToVec2F(config.get("feetOffset")) / TilePixels; m_bodyFullbright = config.getBool("bodyFullbright", false); + m_useBodyMask = config.getBool("useBodyMask", false); + m_useBodyHeadMask = config.getBool("useBodyHeadMask", false); m_headArmorOffset = jsonToVec2F(config.get("headArmorOffset")) / TilePixels; m_chestArmorOffset = jsonToVec2F(config.get("chestArmorOffset")) / TilePixels; @@ -751,18 +759,32 @@ List Humanoid::render(bool withItems, bool withRotationAndScale) { } if (!m_bodyFrameset.empty() && !m_bodyHidden) { - String image; auto bodyDirectives = getBodyDirectives(); auto prefix = bodyDirectives.prefix(); + String framePrefix; if (dance.isValid() && danceStep->bodyFrame) - image = strf("{}:{}{}", m_bodyFrameset, *danceStep->bodyFrame, prefix); + framePrefix = strf("{}{}", *danceStep->bodyFrame, prefix); else if (m_state == Idle) - image = strf("{}:{}{}", m_bodyFrameset, m_identity.personality.idle, prefix); + framePrefix = strf("{}{}", m_identity.personality.idle, prefix); else - image = strf("{}:{}.{}{}", m_bodyFrameset, frameBase(m_state), bodyStateSeq, prefix); - auto drawable = Drawable::makeImage(std::move(image), 1.0f / TilePixels, true, {}); + framePrefix = strf("{}.{}{}", frameBase(m_state), bodyStateSeq, prefix); + String image = strf("{}:{}",m_bodyFrameset,framePrefix); + auto drawable = Drawable::makeImage(m_useBodyHeadMask ? image : std::move(image), 1.0f / TilePixels, true, {}); drawable.imagePart().addDirectives(bodyDirectives, true); + if (m_useBodyMask && !m_bodyMaskFrameset.empty()) { + String maskImage = strf("{}:{}",m_bodyMaskFrameset,framePrefix); + Directives maskDirectives = "?addmask="+maskImage+";0;0"; + drawable.imagePart().addDirectives(maskDirectives, true); + } addDrawable(std::move(drawable), m_bodyFullbright); + if (m_useBodyHeadMask && !m_bodyHeadMaskFrameset.empty()) { + String maskImage = strf("{}:{}",m_bodyHeadMaskFrameset,framePrefix); + Directives maskDirectives = "?addmask="+maskImage+";0;0"; + auto drawable = Drawable::makeImage(std::move(image), 1.0f / TilePixels, true, {}); + drawable.imagePart().addDirectives(bodyDirectives, true); + drawable.imagePart().addDirectives(maskDirectives, true); + addHeadDrawable(std::move(drawable), m_bodyFullbright); + } } if (!m_legsArmorFrameset.empty()) { @@ -1275,6 +1297,18 @@ String Humanoid::getBodyFromIdentity() const { GenderNames.getRight(m_identity.gender)); } +String Humanoid::getBodyMaskFromIdentity() const { + return strf("/humanoid/{}/mask/{}body.png", + m_identity.imagePath ? *m_identity.imagePath : m_identity.species, + GenderNames.getRight(m_identity.gender)); +} + +String Humanoid::getBodyHeadMaskFromIdentity() const { + return strf("/humanoid/{}/headmask/{}body.png", + m_identity.imagePath ? *m_identity.imagePath : m_identity.species, + GenderNames.getRight(m_identity.gender)); +} + String Humanoid::getFacialEmotesFromIdentity() const { return strf("/humanoid/{}/emote.png", m_identity.imagePath ? *m_identity.imagePath : m_identity.species); } -- cgit v1.2.3