OpenMW
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
actoradapter.hpp
Go to the documentation of this file.
1 #ifndef CSM_WOLRD_ACTORADAPTER_H
2 #define CSM_WOLRD_ACTORADAPTER_H
3 
4 #include <array>
5 #include <map>
6 #include <unordered_set>
7 
8 #include <QObject>
9 #include <QModelIndex>
10 
14 
15 #include "refidcollection.hpp"
16 #include "idcollection.hpp"
17 
18 namespace ESM
19 {
20  struct Race;
21 }
22 
23 namespace CSMWorld
24 {
25  class Data;
26 
29  class ActorAdapter : public QObject
30  {
31  Q_OBJECT
32  public:
33 
35  using ActorPartList = std::map<ESM::PartReferenceType, std::pair<std::string, int>>;
37  using RacePartList = std::array<std::string, ESM::BodyPart::MP_Count>;
39  using StringSet = std::unordered_set<std::string>;
40 
41 
43  class RaceData
44  {
45  public:
47  const std::string& getId() const;
49  bool isBeast() const;
51  bool handlesPart(ESM::PartReferenceType type) const;
53  const std::string& getFemalePart(ESM::PartReferenceType index) const;
55  const std::string& getMalePart(ESM::PartReferenceType index) const;
57  bool hasDependency(const std::string& id) const;
58 
60  void setFemalePart(ESM::BodyPart::MeshPart partIndex, const std::string& partId);
62  void setMalePart(ESM::BodyPart::MeshPart partIndex, const std::string& partId);
64  void addOtherDependency(const std::string& id);
66  void reset_data(const std::string& raceId, bool isBeast=false);
67 
68  private:
69  bool handles(ESM::PartReferenceType type) const;
70  std::string mId;
71  bool mIsBeast;
75  };
76  using RaceDataPtr = std::shared_ptr<RaceData>;
77 
80  class ActorData
81  {
82  public:
84  const std::string& getId() const;
86  bool isCreature() const;
88  bool isFemale() const;
90  std::string getSkeleton() const;
92  const std::string getPart(ESM::PartReferenceType index) const;
94  bool hasDependency(const std::string& id) const;
95 
97  void setPart(ESM::PartReferenceType partIndex, const std::string& partId, int priority);
99  void addOtherDependency(const std::string& id);
101  void reset_data(const std::string& actorId, const std::string& skeleton="", bool isCreature=false, bool female=true, RaceDataPtr raceData=nullptr);
102 
103  private:
104  std::string mId;
105  bool mCreature;
106  bool mFemale;
107  std::string mSkeletonOverride;
111  };
112  using ActorDataPtr = std::shared_ptr<ActorData>;
113 
114 
115  ActorAdapter(Data& data);
116 
118  ActorDataPtr getActorData(const std::string& refId);
119 
120  signals:
121 
122  void actorChanged(const std::string& refId);
123 
124  public slots:
125 
126  void handleReferenceablesInserted(const QModelIndex&, int, int);
127  void handleReferenceableChanged(const QModelIndex&, const QModelIndex&);
128  void handleReferenceablesAboutToBeRemoved(const QModelIndex&, int, int);
129  void handleReferenceablesRemoved(const QModelIndex&, int, int);
130 
131  void handleRacesInserted(const QModelIndex&, int, int);
132  void handleRaceChanged(const QModelIndex&, const QModelIndex&);
133  void handleRacesAboutToBeRemoved(const QModelIndex&, int, int);
134  void handleRacesRemoved(const QModelIndex&, int, int);
135 
136  void handleBodyPartsInserted(const QModelIndex&, int, int);
137  void handleBodyPartChanged(const QModelIndex&, const QModelIndex&);
138  void handleBodyPartsAboutToBeRemoved(const QModelIndex&, int, int);
139  void handleBodyPartsRemoved(const QModelIndex&, int, int);
140 
141  private:
142 
143  ActorAdapter(const ActorAdapter&) = delete;
144  ActorAdapter& operator=(const ActorAdapter&) = delete;
145 
146  QModelIndex getHighestIndex(QModelIndex) const;
147  bool is1stPersonPart(const std::string& id) const;
148 
149  RaceDataPtr getRaceData(const std::string& raceId);
150 
151  void setupActor(const std::string& id, ActorDataPtr data);
152  void setupRace(const std::string& id, RaceDataPtr data);
153 
154  void setupNpc(const std::string& id, ActorDataPtr data);
155  void addNpcItem(const std::string& itemId, ActorDataPtr data);
156 
157  void setupCreature(const std::string& id, ActorDataPtr data);
158 
159  void markDirtyDependency(const std::string& dependency);
160  void updateDirty();
161 
165 
168 
169  StringSet mDirtyActors; // Actors that need updating
170  StringSet mDirtyRaces; // Races that need updating
171  };
172 }
173 
174 #endif
MeshPart
Definition: loadbody.hpp:18
RacePartList mMaleParts
Definition: actoradapter.hpp:73
std::string mId
Definition: actoradapter.hpp:70
std::map< ESM::PartReferenceType, std::pair< std::string, int >> ActorPartList
A list indexed by ESM::PartReferenceType.
Definition: actoradapter.hpp:35
void setupCreature(const std::string &id, ActorDataPtr data)
Definition: actoradapter.cpp:632
std::string mSkeletonOverride
Definition: actoradapter.hpp:107
PartReferenceType
Definition: loadarmo.hpp:13
bool mCreature
Definition: actoradapter.hpp:105
std::shared_ptr< RaceData > RaceDataPtr
Definition: actoradapter.hpp:76
Contains base race data shared between actors.
Definition: actoradapter.hpp:43
const std::string & getFemalePart(ESM::PartReferenceType index) const
Retrieves the associated body part.
Definition: actoradapter.cpp:39
static const struct @8 signals[]
void updateDirty()
Definition: actoradapter.cpp:655
void setupNpc(const std::string &id, ActorDataPtr data)
Definition: actoradapter.cpp:508
void markDirtyDependency(const std::string &dependency)
Definition: actoradapter.cpp:641
Misc::WeakCache< std::string, ActorData > mCachedActors
Definition: actoradapter.hpp:166
const std::string & getId() const
Retrieves the id of the actor represented.
Definition: actoradapter.cpp:86
QModelIndex getHighestIndex(QModelIndex) const
Definition: actoradapter.cpp:397
void handleRacesInserted(const QModelIndex &, int, int)
Definition: actoradapter.cpp:274
std::array< std::string, ESM::BodyPart::MP_Count > RacePartList
A list indexed by ESM::BodyPart::MeshPart.
Definition: actoradapter.hpp:37
void handleBodyPartsRemoved(const QModelIndex &, int, int)
Definition: actoradapter.cpp:391
const std::string & getMalePart(ESM::PartReferenceType index) const
Retrieves the associated body part.
Definition: actoradapter.cpp:44
void handleReferenceableChanged(const QModelIndex &, const QModelIndex &)
Definition: actoradapter.cpp:235
void reset_data(const std::string &actorId, const std::string &skeleton="", bool isCreature=false, bool female=true, RaceDataPtr raceData=nullptr)
Clears race, parts, and dependencies.
Definition: actoradapter.cpp:156
void handleReferenceablesAboutToBeRemoved(const QModelIndex &, int, int)
Definition: actoradapter.cpp:255
bool hasDependency(const std::string &id) const
Checks if the actor has a data dependency.
Definition: actoradapter.cpp:133
bool mIsBeast
Definition: actoradapter.hpp:71
void reset_data(const std::string &raceId, bool isBeast=false)
Clears parts and dependencies.
Definition: actoradapter.cpp:71
bool isFemale() const
Checks if the actor is female.
Definition: actoradapter.cpp:96
Definition: actoradapter.hpp:80
void handleBodyPartsAboutToBeRemoved(const QModelIndex &, int, int)
Definition: actoradapter.cpp:378
const std::string getPart(ESM::PartReferenceType index) const
Retrieves the associated actor part.
Definition: actoradapter.cpp:113
bool is1stPersonPart(const std::string &id) const
Definition: actoradapter.cpp:404
IdCollection< ESM::Race > & mRaces
Definition: actoradapter.hpp:163
std::string getSkeleton() const
Returns the skeleton the actor should use for attaching parts to.
Definition: actoradapter.cpp:101
Definition: weakcache.hpp:13
std::shared_ptr< ActorData > ActorDataPtr
Definition: actoradapter.hpp:112
bool handles(ESM::PartReferenceType type) const
Definition: data.hpp:80
Definition: refidcollection.hpp:40
void setPart(ESM::PartReferenceType partIndex, const std::string &partId, int priority)
Sets the actor part used and marks a dependency.
Definition: actoradapter.cpp:138
ActorAdapter(Data &data)
Definition: actoradapter.cpp:172
RacePartList mFemaleParts
Definition: actoradapter.hpp:72
StringSet mDependencies
Definition: actoradapter.hpp:110
bool isCreature() const
Checks if the actor is a creature.
Definition: actoradapter.cpp:91
std::unordered_set< std::string > StringSet
Tracks unique strings.
Definition: actoradapter.hpp:39
Misc::WeakCache< std::string, RaceData > mCachedRaces
Definition: actoradapter.hpp:167
StringSet mDirtyRaces
Definition: actoradapter.hpp:170
void handleReferenceablesRemoved(const QModelIndex &, int, int)
Definition: actoradapter.cpp:268
void handleRacesAboutToBeRemoved(const QModelIndex &, int, int)
Definition: actoradapter.cpp:309
std::string mId
Definition: actoradapter.hpp:104
bool hasDependency(const std::string &id) const
Checks if the race has a data dependency.
Definition: actoradapter.cpp:49
void handleBodyPartsInserted(const QModelIndex &, int, int)
Definition: actoradapter.cpp:328
void setFemalePart(ESM::BodyPart::MeshPart partIndex, const std::string &partId)
Sets the associated part if it's empty and marks a dependency.
Definition: actoradapter.cpp:54
void handleReferenceablesInserted(const QModelIndex &, int, int)
Definition: actoradapter.cpp:219
StringSet mDependencies
Definition: actoradapter.hpp:74
void addOtherDependency(const std::string &id)
Marks an additional dependency for the actor.
Definition: actoradapter.cpp:151
void setupActor(const std::string &id, ActorDataPtr data)
Definition: actoradapter.cpp:422
void setMalePart(ESM::BodyPart::MeshPart partIndex, const std::string &partId)
Sets the associated part if it's empty and marks a dependency.
Definition: actoradapter.cpp:60
void actorChanged(const std::string &refId)
void handleBodyPartChanged(const QModelIndex &, const QModelIndex &)
Definition: actoradapter.cpp:351
IdCollection< ESM::BodyPart > & mBodyParts
Definition: actoradapter.hpp:164
StringSet mDirtyActors
Definition: actoradapter.hpp:169
Definition: actoradapter.hpp:29
const std::string & getId() const
Retrieves the id of the race represented.
Definition: actoradapter.cpp:14
void addNpcItem(const std::string &itemId, ActorDataPtr data)
Definition: actoradapter.cpp:530
RefIdCollection & mReferenceables
Definition: actoradapter.hpp:162
ActorDataPtr getActorData(const std::string &refId)
Obtains the shared data for a given actor.
Definition: actoradapter.cpp:203
RaceDataPtr getRaceData(const std::string &raceId)
Definition: actoradapter.cpp:409
void setupRace(const std::string &id, RaceDataPtr data)
Definition: actoradapter.cpp:464
bool handlesPart(ESM::PartReferenceType type) const
Checks if a part could exist for the given type.
Definition: actoradapter.cpp:24
void handleRacesRemoved(const QModelIndex &, int, int)
Definition: actoradapter.cpp:322
void addOtherDependency(const std::string &id)
Marks an additional dependency.
Definition: actoradapter.cpp:66
void handleRaceChanged(const QModelIndex &, const QModelIndex &)
Definition: actoradapter.cpp:290
bool mFemale
Definition: actoradapter.hpp:106
bool isBeast() const
Checks if it's a beast race.
Definition: actoradapter.cpp:19
ActorAdapter & operator=(const ActorAdapter &)=delete
ActorPartList mParts
Definition: actoradapter.hpp:109
RaceDataPtr mRaceData
Definition: actoradapter.hpp:108