From 53ae8235f365250e609c81e95a5be8231b92d30d Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Wed, 22 May 2013 14:43:25 -0700 Subject: [PATCH] Fixed threading issue with Environment, more work on avatar righting. --- interface/src/Avatar.cpp | 11 ++++------- interface/src/Avatar.h | 1 + interface/src/Environment.cpp | 28 ++++++++++++++++++++++------ interface/src/Environment.h | 9 ++++++--- 4 files changed, 33 insertions(+), 16 deletions(-) diff --git a/interface/src/Avatar.cpp b/interface/src/Avatar.cpp index a7cd4ae5e2..5e7aeb3006 100644 --- a/interface/src/Avatar.cpp +++ b/interface/src/Avatar.cpp @@ -340,7 +340,7 @@ void Avatar::simulate(float deltaTime, Transmitter* transmitter) { float gravityLength = glm::length(_gravity); if (gravityLength > 0.0f) { glm::vec3 targetUp = _gravity / -gravityLength; - const glm::vec3& currentUp = _orientation.getUp(); + const glm::vec3& currentUp = _righting * glm::vec3(0.0f, 1.0f, 0.0f); float angle = glm::degrees(acosf(glm::dot(currentUp, targetUp))); if (angle > 0.0f) { glm::vec3 axis; @@ -349,11 +349,7 @@ void Avatar::simulate(float deltaTime, Transmitter* transmitter) { } else { axis = glm::normalize(glm::cross(currentUp, targetUp)); } - _orientation.rotate(glm::angleAxis(min(deltaTime * ANGULAR_RIGHTING_SPEED, angle), axis)); - glm::vec3 eulerAngles = glm::eulerAngles(_orientation.getQuat()); - _bodyYaw = eulerAngles.y; - _bodyPitch = eulerAngles.x; - _bodyRoll = eulerAngles.z; + _righting = glm::angleAxis(min(deltaTime * ANGULAR_RIGHTING_SPEED, angle), axis) * _righting; } } @@ -616,7 +612,7 @@ void Avatar::updateCollisionWithSphere(glm::vec3 position, float radius, float d void Avatar::updateCollisionWithEnvironment() { if (_position.y < _pelvisStandingHeight) { - applyCollisionWithScene(glm::vec3(0.0f, _pelvisStandingHeight - _position.y, 0.0f)); + //applyCollisionWithScene(glm::vec3(0.0f, _pelvisStandingHeight - _position.y, 0.0f)); } float radius = _height * 0.125f; @@ -1005,6 +1001,7 @@ void Avatar::updateSkeleton() { _orientation.yaw (_bodyYaw ); _orientation.pitch(_bodyPitch); _orientation.roll (_bodyRoll ); + _orientation.rotate(_righting); // calculate positions of all bones by traversing the skeleton tree: for (int b = 0; b < NUM_AVATAR_JOINTS; b++) { diff --git a/interface/src/Avatar.h b/interface/src/Avatar.h index 8fe4030446..34ed0004ff 100644 --- a/interface/src/Avatar.h +++ b/interface/src/Avatar.h @@ -169,6 +169,7 @@ private: float _speed; float _maxArmLength; Orientation _orientation; + glm::quat _righting; int _driveKeys[MAX_DRIVE_KEYS]; float _pelvisStandingHeight; float _height; diff --git a/interface/src/Environment.cpp b/interface/src/Environment.cpp index 6b5cca5bc4..990dd83698 100644 --- a/interface/src/Environment.cpp +++ b/interface/src/Environment.cpp @@ -6,6 +6,7 @@ // Copyright (c) 2013 High Fidelity, Inc. All rights reserved. #include +#include #include #include @@ -40,6 +41,9 @@ void Environment::init() { } void Environment::renderAtmospheres(Camera& camera) { + // get the lock for the duration of the call + QMutexLocker locker(&_mutex); + foreach (const ServerData& serverData, _data) { foreach (const EnvironmentData& environmentData, serverData) { renderAtmosphere(camera, environmentData); @@ -47,7 +51,10 @@ void Environment::renderAtmospheres(Camera& camera) { } } -glm::vec3 Environment::getGravity (const glm::vec3& position) const { +glm::vec3 Environment::getGravity (const glm::vec3& position) { + // get the lock for the duration of the call + QMutexLocker locker(&_mutex); + glm::vec3 gravity; foreach (const ServerData& serverData, _data) { foreach (const EnvironmentData& environmentData, serverData) { @@ -60,24 +67,30 @@ glm::vec3 Environment::getGravity (const glm::vec3& position) const { return gravity; } -const EnvironmentData& Environment::getClosestData(const glm::vec3& position) const { - const EnvironmentData* closest; +const EnvironmentData Environment::getClosestData(const glm::vec3& position) { + // get the lock for the duration of the call + QMutexLocker locker(&_mutex); + + EnvironmentData closest; float closestDistance = FLT_MAX; foreach (const ServerData& serverData, _data) { foreach (const EnvironmentData& environmentData, serverData) { float distance = glm::distance(position, environmentData.getAtmosphereCenter()) - environmentData.getAtmosphereOuterRadius(); if (distance < closestDistance) { - closest = &environmentData; + closest = environmentData; closestDistance = distance; } } } - return *closest; + return closest; } bool Environment::findCapsulePenetration(const glm::vec3& start, const glm::vec3& end, - float radius, glm::vec3& penetration) const { + float radius, glm::vec3& penetration) { + // get the lock for the duration of the call + QMutexLocker locker(&_mutex); + bool found = false; penetration = glm::vec3(0.0f, 0.0f, 0.0f); foreach (const ServerData& serverData, _data) { @@ -98,6 +111,9 @@ int Environment::parseData(sockaddr *senderAddress, unsigned char* sourceBuffer, EnvironmentData newData; int bytesRead = newData.parseData(sourceBuffer, numBytes); + // get the lock for the duration of the call + QMutexLocker locker(&_mutex); + // update the mapping by address/ID _data[*senderAddress][newData.getID()] = newData; diff --git a/interface/src/Environment.h b/interface/src/Environment.h index 95112806e5..f711f0c38c 100644 --- a/interface/src/Environment.h +++ b/interface/src/Environment.h @@ -10,6 +10,7 @@ #define __interface__Environment__ #include +#include #include @@ -25,10 +26,10 @@ public: void init(); void renderAtmospheres(Camera& camera); - glm::vec3 getGravity (const glm::vec3& position) const; - const EnvironmentData& getClosestData(const glm::vec3& position) const; + glm::vec3 getGravity (const glm::vec3& position); + const EnvironmentData getClosestData(const glm::vec3& position); - bool findCapsulePenetration(const glm::vec3& start, const glm::vec3& end, float radius, glm::vec3& penetration) const; + bool findCapsulePenetration(const glm::vec3& start, const glm::vec3& end, float radius, glm::vec3& penetration); int parseData(sockaddr *senderAddress, unsigned char* sourceBuffer, int numBytes); @@ -67,6 +68,8 @@ private: typedef QHash ServerData; QHash _data; + + QMutex _mutex; }; #endif /* defined(__interface__Environment__) */