14 #ifndef hifi_AvatarManager_h
15 #define hifi_AvatarManager_h
19 #include <QtCore/QHash>
20 #include <QtCore/QObject>
22 #include <AvatarHashMap.h>
23 #include <PhysicsEngine.h>
24 #include <PIDController.h>
25 #include <SimpleMovingAverage.h>
26 #include <shared/RateCounter.h>
27 #include <avatars-renderer/ScriptAvatar.h>
28 #include <AudioInjectorManager.h>
29 #include <workload/Space.h>
30 #include <EntitySimulation.h>
31 #include <ScriptValue.h>
33 #include "AvatarMotionState.h"
34 #include "DetailedMotionState.h"
36 #include "OtherAvatar.h"
39 using SortedAvatar = std::pair<float, std::shared_ptr<Avatar>>;
68 class AvatarManager :
public AvatarHashMap {
102 virtual ~AvatarManager();
105 void setSpace(workload::SpacePointer& space );
107 std::shared_ptr<MyAvatar> getMyAvatar() {
return _myAvatar; }
108 glm::vec3 getMyAvatarPosition()
const {
return _myAvatar->getWorldPosition(); }
114 Q_INVOKABLE
virtual ScriptAvatarData* getAvatar(QUuid avatarID)
override {
return new ScriptAvatar(getAvatarBySessionID(avatarID)); }
116 AvatarSharedPointer getAvatarBySessionID(
const QUuid& sessionID)
const override;
118 int getNumAvatarsUpdated()
const {
return _numAvatarsUpdated; }
119 int getNumAvatarsNotUpdated()
const {
return _numAvatarsNotUpdated; }
120 int getNumHeroAvatars()
const {
return _numHeroAvatars; }
121 int getNumHeroAvatarsUpdated()
const {
return _numHeroAvatarsUpdated; }
122 float getAvatarSimulationTime()
const {
return _avatarSimulationTime; }
124 void updateMyAvatar(
float deltaTime);
125 void updateOtherAvatars(
float deltaTime);
127 void setMyAvatarDataPacketsPaused(
bool puase);
129 void postUpdate(
float deltaTime,
const render::ScenePointer& scene);
131 void clearOtherAvatars()
override;
132 void deleteAllAvatars();
134 void getObjectsToRemoveFromPhysics(VectorOfMotionStates& motionStates);
135 void getObjectsToAddToPhysics(VectorOfMotionStates& motionStates);
136 void getObjectsToChange(VectorOfMotionStates& motionStates);
138 void handleChangedMotionStates(
const VectorOfMotionStates& motionStates);
139 void handleCollisionEvents(
const CollisionEvents& collisionEvents);
148 Q_INVOKABLE
float getAvatarDataRate(
const QUuid& sessionID,
const QString& rateName = QString(
""))
const;
157 Q_INVOKABLE
float getAvatarUpdateRate(
const QUuid& sessionID,
const QString& rateName = QString(
""))
const;
166 Q_INVOKABLE
float getAvatarSimulationRate(
const QUuid& sessionID,
const QString& rateName = QString(
""))
const;
190 Q_INVOKABLE RayToAvatarIntersectionResult findRayIntersection(
const PickRay& ray,
193 bool pickAgainstMesh =
true);
203 Q_INVOKABLE RayToAvatarIntersectionResult findRayIntersectionVector(
const PickRay& ray,
204 const QVector<EntityItemID>& avatarsToInclude,
205 const QVector<EntityItemID>& avatarsToDiscard,
206 bool pickAgainstMesh);
216 Q_INVOKABLE ParabolaToAvatarIntersectionResult findParabolaIntersectionVector(
const PickParabola& pick,
217 const QVector<EntityItemID>& avatarsToInclude,
218 const QVector<EntityItemID>& avatarsToDiscard);
227 Q_INVOKABLE
float getAvatarSortCoefficient(
const QString& name);
235 Q_INVOKABLE
void setAvatarSortCoefficient(
const QString& name,
const ScriptValue& value);
248 Q_INVOKABLE QVariantMap getPalData(
const QStringList& specificAvatarIdentifiers = QStringList());
250 float getMyAvatarSendRate()
const {
return _myAvatarSendRate.rate(); }
252 void queuePhysicsChange(
const OtherAvatarPointer& avatar);
253 void buildPhysicsTransaction(PhysicsEngine::Transaction& transaction);
254 void handleProcessedPhysicsTransaction(PhysicsEngine::Transaction& transaction);
255 void removeDeadAvatarEntities(
const SetOfEntities& deadEntities);
257 void accumulateGrabPositions(std::map<QUuid, GrabLocationAccumulator>& grabAccumulators);
265 void updateAvatarRenderStatus(
bool shouldRenderAvatars);
272 void setEnableDebugDrawOtherSkeletons(
bool isEnabled) {
273 _drawOtherAvatarSkeletons = isEnabled;
277 AvatarSharedPointer addAvatar(
const QUuid& sessionUUID,
const QWeakPointer<Node>& mixerWeakPointer)
override;
278 DetailedMotionState* createDetailedMotionState(OtherAvatarPointer avatar, int32_t jointIndex);
279 void rebuildAvatarPhysics(PhysicsEngine::Transaction& transaction,
const OtherAvatarPointer& avatar);
280 void removeDetailedAvatarPhysics(PhysicsEngine::Transaction& transaction,
const OtherAvatarPointer& avatar);
281 void rebuildDetailedAvatarPhysics(PhysicsEngine::Transaction& transaction,
const OtherAvatarPointer& avatar);
284 explicit AvatarManager(QObject* parent = 0);
285 explicit AvatarManager(
const AvatarManager& other);
287 AvatarSharedPointer newSharedAvatar(
const QUuid& sessionUUID)
override;
292 void handleRemovedAvatar(
const AvatarSharedPointer& removedAvatar,
293 KillAvatarReason removalReason = KillAvatarReason::NoReason)
override;
294 void handleTransitAnimations(AvatarTransit::Status status);
296 using SetOfOtherAvatars = std::set<OtherAvatarPointer>;
297 SetOfOtherAvatars _otherAvatarsToChangeInPhysics;
299 std::shared_ptr<MyAvatar> _myAvatar;
300 quint64 _lastSendAvatarDataTime = 0;
302 std::list<QWeakPointer<AudioInjector>> _collisionInjectors;
304 RateCounter<> _myAvatarSendRate;
305 int _numAvatarsUpdated { 0 };
306 int _numAvatarsNotUpdated { 0 };
307 int _numHeroAvatars{ 0 };
308 int _numHeroAvatarsUpdated{ 0 };
309 float _avatarSimulationTime { 0.0f };
310 bool _shouldRender {
true };
311 bool _myAvatarDataPacketsPaused {
false };
313 mutable std::mutex _spaceLock;
314 workload::SpacePointer _space;
316 AvatarTransit::TransitConfig _transitConfig;
317 bool _drawOtherAvatarSkeletons {
false };
Provides an engine-independent interface for a scripting engine.
Definition: ScriptEngine.h:93
[ScriptInterface] Provides an engine-independent interface for QScriptValue
Definition: ScriptValue.h:40