From 049550d73ef927fd76b596cef99fd2e483912846 Mon Sep 17 00:00:00 2001 From: Dave Corley Date: Mon, 1 Jan 2024 21:00:00 -0600 Subject: [PATCH] Cleanup(Actoradapter.cpp): Create new struct for race stats, use std::pair instead --- apps/opencs/model/world/actoradapter.cpp | 18 ++++++++++++---- apps/opencs/model/world/actoradapter.hpp | 27 ++++++++++++++++++++++-- apps/opencs/view/render/actor.cpp | 10 ++------- 3 files changed, 41 insertions(+), 14 deletions(-) diff --git a/apps/opencs/model/world/actoradapter.cpp b/apps/opencs/model/world/actoradapter.cpp index e4b577480d..f3c2161c73 100644 --- a/apps/opencs/model/world/actoradapter.cpp +++ b/apps/opencs/model/world/actoradapter.cpp @@ -67,6 +67,11 @@ namespace CSMWorld return mMaleParts[ESM::getMeshPart(index)]; } + const std::pair& ActorAdapter::RaceData::getRaceAttributes(bool isFemale) + { + return isFemale == true ? mHeightsWeights.mFemaleAttributes : mHeightsWeights.mMaleAttributes; + } + bool ActorAdapter::RaceData::hasDependency(const ESM::RefId& id) const { return mDependencies.find(id) != mDependencies.end(); @@ -90,10 +95,11 @@ namespace CSMWorld mDependencies.emplace(id); } - void ActorAdapter::RaceData::reset_data(const ESM::RefId& id, bool isBeast) + void ActorAdapter::RaceData::reset_data(const ESM::RefId& id, const BodyAttributes& raceStats, bool isBeast) { mId = id; mIsBeast = isBeast; + mHeightsWeights = raceStats; for (auto& str : mFemaleParts) str = ESM::RefId(); for (auto& str : mMaleParts) @@ -163,9 +169,9 @@ namespace CSMWorld return it->second.first; } - const ESM::RefId& ActorAdapter::ActorData::getActorRaceName() const + const std::pair& ActorAdapter::ActorData::getRaceHeightWeight() const { - return mRaceData->getId(); + return mRaceData->getRaceAttributes(isFemale()); } bool ActorAdapter::ActorData::hasDependency(const ESM::RefId& id) const @@ -509,7 +515,11 @@ namespace CSMWorld } auto& race = raceRecord.get(); - data->reset_data(id, race.mData.mFlags & ESM::Race::Beast); + + BodyAttributes scaleStats = BodyAttributes( + race.mData.mMaleHeight, race.mData.mMaleWeight, race.mData.mFemaleHeight, race.mData.mFemaleWeight); + + data->reset_data(id, scaleStats, race.mData.mFlags & ESM::Race::Beast); // Setup body parts for (int i = 0; i < mBodyParts.getSize(); ++i) diff --git a/apps/opencs/model/world/actoradapter.hpp b/apps/opencs/model/world/actoradapter.hpp index 5ab4da2e58..21298d33df 100644 --- a/apps/opencs/model/world/actoradapter.hpp +++ b/apps/opencs/model/world/actoradapter.hpp @@ -41,6 +41,25 @@ namespace CSMWorld /// Tracks unique strings using RefIdSet = std::unordered_set; + class BodyAttributes + { + public: + std::pair mMaleAttributes; + std::pair mFemaleAttributes; + + BodyAttributes() + : mMaleAttributes(std::make_pair(1.0f, 1.0f)) + , mFemaleAttributes(std::make_pair(1.0f, 1.0f)) + { + } + + BodyAttributes(float maleHeight, float maleWeight, float femaleHeight, float femaleWeight) + { + mMaleAttributes = std::make_pair(maleHeight, maleWeight); + mFemaleAttributes = std::make_pair(femaleHeight, femaleWeight); + } + }; + /// Contains base race data shared between actors class RaceData { @@ -57,6 +76,8 @@ namespace CSMWorld const ESM::RefId& getFemalePart(ESM::PartReferenceType index) const; /// Retrieves the associated body part const ESM::RefId& getMalePart(ESM::PartReferenceType index) const; + + const std::pair& getRaceAttributes(bool isFemale); /// Checks if the race has a data dependency bool hasDependency(const ESM::RefId& id) const; @@ -67,7 +88,8 @@ namespace CSMWorld /// Marks an additional dependency void addOtherDependency(const ESM::RefId& id); /// Clears parts and dependencies - void reset_data(const ESM::RefId& raceId, bool isBeast = false); + void reset_data( + const ESM::RefId& raceId, const BodyAttributes& raceStats = BodyAttributes(), bool isBeast = false); private: bool handles(ESM::PartReferenceType type) const; @@ -75,6 +97,7 @@ namespace CSMWorld bool mIsBeast; RacePartList mFemaleParts; RacePartList mMaleParts; + BodyAttributes mHeightsWeights; RefIdSet mDependencies; }; using RaceDataPtr = std::shared_ptr; @@ -97,7 +120,7 @@ namespace CSMWorld /// Retrieves the associated actor part ESM::RefId getPart(ESM::PartReferenceType index) const; - const ESM::RefId& getActorRaceName() const; + const std::pair& getRaceHeightWeight() const; /// Checks if the actor has a data dependency bool hasDependency(const ESM::RefId& id) const; diff --git a/apps/opencs/view/render/actor.cpp b/apps/opencs/view/render/actor.cpp index cfa06012ff..abe7b910de 100644 --- a/apps/opencs/view/render/actor.cpp +++ b/apps/opencs/view/render/actor.cpp @@ -63,15 +63,9 @@ namespace CSVRender // Attach parts to skeleton loadBodyParts(); - const CSMWorld::IdCollection& races = mData.getRaces(); - const auto& targetRace = races.getRecord(mActorData->getActorRaceName()).get().mData; - osg::Vec3d scale; + const std::pair attributes = mActorData.get()->getRaceHeightWeight(); - mActorData.get()->isFemale() - ? scale = osg::Vec3(targetRace.mFemaleWeight, targetRace.mFemaleWeight, targetRace.mFemaleHeight) - : scale = osg::Vec3(targetRace.mMaleWeight, targetRace.mMaleWeight, targetRace.mMaleHeight); - - mBaseNode->setScale(scale); + mBaseNode->setScale(osg::Vec3d(attributes.second, attributes.second, attributes.first)); } else {