From 0c992ef43dab1d3c12fbd397925b6ea319901e2c Mon Sep 17 00:00:00 2001 From: Jeroen Baert Date: Thu, 30 Jan 2014 13:20:37 +0100 Subject: [PATCH 01/22] Updated Ubuntu package requirements --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bc32998113..92fe83c4e1 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,7 @@ distributions. A Windows build is planned for the future, but not currently in development. On a fresh Ubuntu 13.10 install, these are all the packages you need to grab and build the hifi project: -
sudo apt-get install build-essential cmake git libcurl4-openssl-dev libqt5scripttools5 libqt5svg5-dev libqt5webkit5-dev libqt5location5 qtlocation5-dev qtdeclarative5-dev qtscript5-dev qtsensors5-dev qtmultimedia5-dev qtquick1-5-dev libasound2 libxmu-dev libxi-dev freeglut3-dev libasound2-dev libjack-dev
+
sudo apt-get install build-essential cmake git qttools5-dev libcurl4-openssl-dev libqt5scripttools5 libqt5svg5-dev libqt5webkit5-dev libqt5location5 qtlocation5-dev qtdeclarative5-dev qtscript5-dev qtsensors5-dev qtmultimedia5-dev qtquick1-5-dev libasound2 libxmu-dev libxi-dev freeglut3-dev libasound2-dev libjack-dev
Running Interface ----- From d2800ccd559e9c03ed4fbf9d83a00b70c3174333 Mon Sep 17 00:00:00 2001 From: Jeroen Baert Date: Thu, 3 Apr 2014 11:52:13 +0100 Subject: [PATCH 02/22] For some GLEW distributions, it's just lib --- cmake/modules/FindGLEW.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/modules/FindGLEW.cmake b/cmake/modules/FindGLEW.cmake index 684acca762..dbb366390a 100644 --- a/cmake/modules/FindGLEW.cmake +++ b/cmake/modules/FindGLEW.cmake @@ -20,7 +20,7 @@ else () find_path(GLEW_INCLUDE_DIRS GL/glew.h PATH_SUFFIXES include HINTS ${WIN_GLEW_SEARCH_DIRS}) - find_library(GLEW_LIBRARY glew32s PATH_SUFFIXES "lib/Release/Win32" HINTS ${WIN_GLEW_SEARCH_DIRS}) + find_library(GLEW_LIBRARY glew32s PATH_SUFFIXES "lib/Release/Win32" "lib" HINTS ${WIN_GLEW_SEARCH_DIRS}) endif () include(FindPackageHandleStandardArgs) From 4335ba7b5aa2d5b9b167b05fc9c2ad2b232585db Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Mon, 7 Apr 2014 17:01:24 +0200 Subject: [PATCH 03/22] windows default device fix --- interface/src/Audio.cpp | 73 +++++++++++++++++++++++++++++++---------- 1 file changed, 55 insertions(+), 18 deletions(-) diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 63c683dbb0..3f48c73867 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -15,6 +15,13 @@ #include #endif +#ifdef WIN32 +#include +#include +#include +#include +#endif + #include #include #include @@ -146,24 +153,54 @@ QAudioDeviceInfo defaultAudioDeviceForMode(QAudio::Mode mode) { } #endif #ifdef WIN32 - QString deviceName; - if (mode == QAudio::AudioInput) { - WAVEINCAPS wic; - // first use WAVE_MAPPER to get the default devices manufacturer ID - waveInGetDevCaps(WAVE_MAPPER, &wic, sizeof(wic)); - //Use the received manufacturer id to get the device's real name - waveInGetDevCaps(wic.wMid, &wic, sizeof(wic)); - qDebug() << "input device:" << wic.szPname; - deviceName = wic.szPname; - } else { - WAVEOUTCAPS woc; - // first use WAVE_MAPPER to get the default devices manufacturer ID - waveOutGetDevCaps(WAVE_MAPPER, &woc, sizeof(woc)); - //Use the received manufacturer id to get the device's real name - waveOutGetDevCaps(woc.wMid, &woc, sizeof(woc)); - qDebug() << "output device:" << woc.szPname; - deviceName = woc.szPname; - } + QString deviceName; + //Check for Windows Vista or higher, IMMDeviceEnumerator doesn't work below that. + OSVERSIONINFO osvi; + ZeroMemory(&osvi, sizeof(OSVERSIONINFO)); + osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&osvi); + if (osvi.dwMajorVersion < 6) {// lower then vista + if (mode == QAudio::AudioInput) { + WAVEINCAPS wic; + // first use WAVE_MAPPER to get the default devices manufacturer ID + waveInGetDevCaps(WAVE_MAPPER, &wic, sizeof(wic)); + //Use the received manufacturer id to get the device's real name + waveInGetDevCaps(wic.wMid, &wic, sizeof(wic)); + qDebug() << "input device:" << wic.szPname; + deviceName = wic.szPname; + } else { + WAVEOUTCAPS woc; + // first use WAVE_MAPPER to get the default devices manufacturer ID + waveOutGetDevCaps(WAVE_MAPPER, &woc, sizeof(woc)); + //Use the received manufacturer id to get the device's real name + waveOutGetDevCaps(woc.wMid, &woc, sizeof(woc)); + qDebug() << "output device:" << woc.szPname; + deviceName = woc.szPname; + } + } else { + HRESULT hr = S_OK; + CoInitialize(NULL); + IMMDeviceEnumerator *pMMDeviceEnumerator = NULL; + CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&pMMDeviceEnumerator); + IMMDevice *pEndpoint; + pMMDeviceEnumerator->GetDefaultAudioEndpoint(mode == QAudio::AudioOutput ? eRender : eCapture, eMultimedia, &pEndpoint); + IPropertyStore *pPropertyStore; + pEndpoint->OpenPropertyStore(STGM_READ, &pPropertyStore); + pEndpoint->Release(); + pEndpoint = NULL; + PROPVARIANT pv; + PropVariantInit(&pv); + hr = pPropertyStore->GetValue(PKEY_Device_FriendlyName, &pv); + pPropertyStore->Release(); + pPropertyStore = NULL; + //QAudio devices seems to only take the 31 first characters of the Friendly Device Name. + deviceName = QString::fromWCharArray((wchar_t *)pv.pwszVal).left(31); + qDebug() << (mode == QAudio::AudioOutput ? "output" : "input") << " device:" << deviceName; + PropVariantClear(&pv); + pMMDeviceEnumerator->Release(); + pMMDeviceEnumerator = NULL; + CoUninitialize(); + } qDebug() << "DEBUG [" << deviceName << "] [" << getNamedAudioDeviceForMode(mode, deviceName).deviceName() << "]"; return getNamedAudioDeviceForMode(mode, deviceName); From e9922b6db92337da655290ae9d9f0d98069fa7d7 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Mon, 7 Apr 2014 18:50:13 +0200 Subject: [PATCH 04/22] windows default device fix: - fixed tabs>spaces - doesn't require atlbase anymore, so works on visual studio express --- interface/src/Audio.cpp | 80 +++++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 39 deletions(-) diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 3f48c73867..7e7dfd9df1 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -16,7 +16,9 @@ #endif #ifdef WIN32 -#include +#define WIN32_LEAN_AND_MEAN +#include +#include #include #include #include @@ -153,55 +155,55 @@ QAudioDeviceInfo defaultAudioDeviceForMode(QAudio::Mode mode) { } #endif #ifdef WIN32 - QString deviceName; - //Check for Windows Vista or higher, IMMDeviceEnumerator doesn't work below that. + QString deviceName; + //Check for Windows Vista or higher, IMMDeviceEnumerator doesn't work below that. OSVERSIONINFO osvi; ZeroMemory(&osvi, sizeof(OSVERSIONINFO)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&osvi); - if (osvi.dwMajorVersion < 6) {// lower then vista - if (mode == QAudio::AudioInput) { - WAVEINCAPS wic; - // first use WAVE_MAPPER to get the default devices manufacturer ID - waveInGetDevCaps(WAVE_MAPPER, &wic, sizeof(wic)); - //Use the received manufacturer id to get the device's real name - waveInGetDevCaps(wic.wMid, &wic, sizeof(wic)); - qDebug() << "input device:" << wic.szPname; - deviceName = wic.szPname; - } else { - WAVEOUTCAPS woc; - // first use WAVE_MAPPER to get the default devices manufacturer ID - waveOutGetDevCaps(WAVE_MAPPER, &woc, sizeof(woc)); - //Use the received manufacturer id to get the device's real name - waveOutGetDevCaps(woc.wMid, &woc, sizeof(woc)); - qDebug() << "output device:" << woc.szPname; - deviceName = woc.szPname; - } - } else { - HRESULT hr = S_OK; - CoInitialize(NULL); - IMMDeviceEnumerator *pMMDeviceEnumerator = NULL; - CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&pMMDeviceEnumerator); - IMMDevice *pEndpoint; - pMMDeviceEnumerator->GetDefaultAudioEndpoint(mode == QAudio::AudioOutput ? eRender : eCapture, eMultimedia, &pEndpoint); + if (osvi.dwMajorVersion < 6) {// lower then vista + if (mode == QAudio::AudioInput) { + WAVEINCAPS wic; + // first use WAVE_MAPPER to get the default devices manufacturer ID + waveInGetDevCaps(WAVE_MAPPER, &wic, sizeof(wic)); + //Use the received manufacturer id to get the device's real name + waveInGetDevCaps(wic.wMid, &wic, sizeof(wic)); + qDebug() << "input device:" << wic.szPname; + deviceName = wic.szPname; + } else { + WAVEOUTCAPS woc; + // first use WAVE_MAPPER to get the default devices manufacturer ID + waveOutGetDevCaps(WAVE_MAPPER, &woc, sizeof(woc)); + //Use the received manufacturer id to get the device's real name + waveOutGetDevCaps(woc.wMid, &woc, sizeof(woc)); + qDebug() << "output device:" << woc.szPname; + deviceName = woc.szPname; + } + } else { + HRESULT hr = S_OK; + CoInitialize(NULL); + IMMDeviceEnumerator *pMMDeviceEnumerator = NULL; + CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&pMMDeviceEnumerator); + IMMDevice *pEndpoint; + pMMDeviceEnumerator->GetDefaultAudioEndpoint(mode == QAudio::AudioOutput ? eRender : eCapture, eMultimedia, &pEndpoint); IPropertyStore *pPropertyStore; pEndpoint->OpenPropertyStore(STGM_READ, &pPropertyStore); pEndpoint->Release(); - pEndpoint = NULL; + pEndpoint = NULL; PROPVARIANT pv; - PropVariantInit(&pv); + PropVariantInit(&pv); hr = pPropertyStore->GetValue(PKEY_Device_FriendlyName, &pv); pPropertyStore->Release(); - pPropertyStore = NULL; - //QAudio devices seems to only take the 31 first characters of the Friendly Device Name. - deviceName = QString::fromWCharArray((wchar_t *)pv.pwszVal).left(31); + pPropertyStore = NULL; + //QAudio devices seems to only take the 31 first characters of the Friendly Device Name. + deviceName = QString::fromWCharArray((wchar_t *)pv.pwszVal).left(31); qDebug() << (mode == QAudio::AudioOutput ? "output" : "input") << " device:" << deviceName; - PropVariantClear(&pv); - pMMDeviceEnumerator->Release(); - pMMDeviceEnumerator = NULL; - CoUninitialize(); - } - qDebug() << "DEBUG [" << deviceName << "] [" << getNamedAudioDeviceForMode(mode, deviceName).deviceName() << "]"; + PropVariantClear(&pv); + pMMDeviceEnumerator->Release(); + pMMDeviceEnumerator = NULL; + CoUninitialize(); + } + qDebug() << "DEBUG [" << deviceName << "] [" << getNamedAudioDeviceForMode(mode, deviceName).deviceName() << "]"; return getNamedAudioDeviceForMode(mode, deviceName); #endif From 23c6873d999bd7deed28126766e7ffe51b4872bc Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Mon, 7 Apr 2014 14:12:29 -0700 Subject: [PATCH 05/22] Add Uuid object to ScriptEngine --- libraries/script-engine/src/ScriptEngine.cpp | 7 ++-- libraries/script-engine/src/ScriptEngine.h | 2 ++ libraries/script-engine/src/ScriptUUID.cpp | 35 ++++++++++++++++++++ libraries/script-engine/src/ScriptUUID.h | 29 ++++++++++++++++ 4 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 libraries/script-engine/src/ScriptUUID.cpp create mode 100644 libraries/script-engine/src/ScriptUUID.h diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 7572638a30..7d3dd650ae 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -60,7 +60,8 @@ ScriptEngine::ScriptEngine(const QString& scriptContents, const QString& fileNam _scriptName(), _fileNameString(fileNameString), _quatLibrary(), - _vec3Library() + _vec3Library(), + _uuidLibrary() { } @@ -83,7 +84,8 @@ ScriptEngine::ScriptEngine(const QUrl& scriptURL, _scriptName(), _fileNameString(), _quatLibrary(), - _vec3Library() + _vec3Library(), + _uuidLibrary() { QString scriptURLString = scriptURL.toString(); _fileNameString = scriptURLString; @@ -197,6 +199,7 @@ void ScriptEngine::init() { registerGlobalObject("Particles", &_particlesScriptingInterface); registerGlobalObject("Quat", &_quatLibrary); registerGlobalObject("Vec3", &_vec3Library); + registerGlobalObject("Uuid", &_uuidLibrary); registerGlobalObject("Voxels", &_voxelsScriptingInterface); diff --git a/libraries/script-engine/src/ScriptEngine.h b/libraries/script-engine/src/ScriptEngine.h index 964f64a005..2b98549d66 100644 --- a/libraries/script-engine/src/ScriptEngine.h +++ b/libraries/script-engine/src/ScriptEngine.h @@ -22,6 +22,7 @@ #include "AbstractControllerScriptingInterface.h" #include "Quat.h" +#include "ScriptUUID.h" #include "Vec3.h" class ParticlesScriptingInterface; @@ -121,6 +122,7 @@ private: QString _fileNameString; Quat _quatLibrary; Vec3 _vec3Library; + ScriptUUID _uuidLibrary; }; #endif /* defined(__hifi__ScriptEngine__) */ diff --git a/libraries/script-engine/src/ScriptUUID.cpp b/libraries/script-engine/src/ScriptUUID.cpp new file mode 100644 index 0000000000..cea7247e90 --- /dev/null +++ b/libraries/script-engine/src/ScriptUUID.cpp @@ -0,0 +1,35 @@ +// +// ScriptUUID.h +// hifi +// +// Created by Andrew Meadows on 2014.04.07 +// Copyright (c) 2014 High Fidelity, Inc. All rights reserved. +// + +#include + +#include "ScriptUUID.h" + +QUuid ScriptUUID::fromString(const QString& s) { + return QUuid(s); +} + +QString ScriptUUID::toString(const QUuid& id) { + return id.toString(); +} + +QUuid ScriptUUID::generate() { + return QUuid::createUuid(); +} + +bool ScriptUUID::isEqual(const QUuid& idA, const QUuid& idB) { + return idA == idB; +} + +bool ScriptUUID::isNull(const QUuid& id) { + return id.isNull(); +} + +void ScriptUUID::print(const QString& lable, const QUuid& id) { + qDebug() << qPrintable(lable) << id.toString(); +} diff --git a/libraries/script-engine/src/ScriptUUID.h b/libraries/script-engine/src/ScriptUUID.h new file mode 100644 index 0000000000..43e885cf98 --- /dev/null +++ b/libraries/script-engine/src/ScriptUUID.h @@ -0,0 +1,29 @@ +// +// ScriptUUID.h +// hifi +// +// Created by Andrew Meadows on 2014.04.07 +// Copyright (c) 2014 High Fidelity, Inc. All rights reserved. +// + +#ifndef __hifi__ScriptUUID__ +#define __hifi__ScriptUUID__ + +#include + +/// Scriptable interface a UUID helper class object. Used exclusively in the JavaScript API +class ScriptUUID : public QObject { + Q_OBJECT + +public slots: + QUuid fromString(const QString& string); + QString toString(const QUuid& id); + QUuid generate(); + bool isEqual(const QUuid& idA, const QUuid& idB); + bool isNull(const QUuid& id); + void print(const QString& lable, const QUuid& id); +}; + + + +#endif /* defined(__hifi__Vec3__) */ From 79670563d487058daa08df46f1a64c2b3230f512 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Mon, 7 Apr 2014 14:42:49 -0700 Subject: [PATCH 06/22] AvatarData stores its sessionID --- interface/src/avatar/AvatarManager.cpp | 26 ++++++++++++------------- libraries/avatars/src/AvatarData.h | 5 +++++ libraries/avatars/src/AvatarHashMap.cpp | 1 + 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index c2ba28ac7b..5b98d933ff 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -123,8 +123,8 @@ void AvatarManager::renderAvatarFades(const glm::vec3& cameraPosition, Avatar::R } } -AvatarSharedPointer AvatarManager::matchingOrNewAvatar(const QUuid& nodeUUID, const QWeakPointer& mixerWeakPointer) { - AvatarSharedPointer matchingAvatar = _avatarHash.value(nodeUUID); +AvatarSharedPointer AvatarManager::matchingOrNewAvatar(const QUuid& sessionID, const QWeakPointer& mixerWeakPointer) { + AvatarSharedPointer matchingAvatar = _avatarHash.value(sessionID); if (!matchingAvatar) { // construct a new Avatar for this node @@ -133,9 +133,9 @@ AvatarSharedPointer AvatarManager::matchingOrNewAvatar(const QUuid& nodeUUID, co // insert the new avatar into our hash matchingAvatar = AvatarSharedPointer(avatar); - _avatarHash.insert(nodeUUID, matchingAvatar); + _avatarHash.insert(sessionID, matchingAvatar); - qDebug() << "Adding avatar with UUID" << nodeUUID << "to AvatarManager hash."; + qDebug() << "Adding avatar with sessionID " << sessionID << "to AvatarManager hash."; } return matchingAvatar; @@ -166,10 +166,10 @@ void AvatarManager::processAvatarDataPacket(const QByteArray &datagram, const QW // enumerate over all of the avatars in this packet // only add them if mixerWeakPointer points to something (meaning that mixer is still around) while (bytesRead < datagram.size() && mixerWeakPointer.data()) { - QUuid nodeUUID = QUuid::fromRfc4122(datagram.mid(bytesRead, NUM_BYTES_RFC4122_UUID)); + QUuid sessionID = QUuid::fromRfc4122(datagram.mid(bytesRead, NUM_BYTES_RFC4122_UUID)); bytesRead += NUM_BYTES_RFC4122_UUID; - AvatarSharedPointer matchingAvatarData = matchingOrNewAvatar(nodeUUID, mixerWeakPointer); + AvatarSharedPointer matchingAvatarData = matchingOrNewAvatar(sessionID, mixerWeakPointer); // have the matching (or new) avatar parse the data from the packet bytesRead += matchingAvatarData->parseDataAtOffset(datagram, bytesRead); @@ -188,16 +188,16 @@ void AvatarManager::processAvatarIdentityPacket(const QByteArray &packet, const QDataStream identityStream(packet); identityStream.skipRawData(numBytesForPacketHeader(packet)); - QUuid nodeUUID; + QUuid sessionID; while (!identityStream.atEnd()) { QUrl faceMeshURL, skeletonURL; QString displayName; - identityStream >> nodeUUID >> faceMeshURL >> skeletonURL >> displayName; + identityStream >> sessionID >> faceMeshURL >> skeletonURL >> displayName; // mesh URL for a UUID, find avatar in our list - AvatarSharedPointer matchingAvatar = matchingOrNewAvatar(nodeUUID, mixerWeakPointer); + AvatarSharedPointer matchingAvatar = matchingOrNewAvatar(sessionID, mixerWeakPointer); if (matchingAvatar) { Avatar* avatar = static_cast(matchingAvatar.data()); @@ -218,9 +218,9 @@ void AvatarManager::processAvatarIdentityPacket(const QByteArray &packet, const void AvatarManager::processAvatarBillboardPacket(const QByteArray& packet, const QWeakPointer& mixerWeakPointer) { int headerSize = numBytesForPacketHeader(packet); - QUuid nodeUUID = QUuid::fromRfc4122(QByteArray::fromRawData(packet.constData() + headerSize, NUM_BYTES_RFC4122_UUID)); + QUuid sessionID = QUuid::fromRfc4122(QByteArray::fromRawData(packet.constData() + headerSize, NUM_BYTES_RFC4122_UUID)); - AvatarSharedPointer matchingAvatar = matchingOrNewAvatar(nodeUUID, mixerWeakPointer); + AvatarSharedPointer matchingAvatar = matchingOrNewAvatar(sessionID, mixerWeakPointer); if (matchingAvatar) { Avatar* avatar = static_cast(matchingAvatar.data()); QByteArray billboard = packet.mid(headerSize + NUM_BYTES_RFC4122_UUID); @@ -232,10 +232,10 @@ void AvatarManager::processAvatarBillboardPacket(const QByteArray& packet, const void AvatarManager::processKillAvatar(const QByteArray& datagram) { // read the node id - QUuid nodeUUID = QUuid::fromRfc4122(datagram.mid(numBytesForPacketHeader(datagram), NUM_BYTES_RFC4122_UUID)); + QUuid sessionID = QUuid::fromRfc4122(datagram.mid(numBytesForPacketHeader(datagram), NUM_BYTES_RFC4122_UUID)); // remove the avatar with that UUID from our hash, if it exists - AvatarHash::iterator matchedAvatar = _avatarHash.find(nodeUUID); + AvatarHash::iterator matchedAvatar = _avatarHash.find(sessionID); if (matchedAvatar != _avatarHash.end()) { erase(matchedAvatar); } diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 221bbd0428..2637b5a0c3 100755 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -36,6 +36,7 @@ typedef unsigned long long quint64; #include #include #include +#include #include #include @@ -97,6 +98,9 @@ public: AvatarData(); virtual ~AvatarData(); + const QUuid& getSessionID() { return _sessionID; } + void setSessionID(const QUuid& id) { _sessionID = id; } + const glm::vec3& getPosition() const { return _position; } void setPosition(const glm::vec3 position) { _position = position; } @@ -218,6 +222,7 @@ public slots: void sendBillboardPacket(); void setBillboardFromNetworkReply(); protected: + QUuid _sessionID; glm::vec3 _position; glm::vec3 _handPosition; diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index 82485691c5..5a56e3d5dc 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -15,6 +15,7 @@ AvatarHashMap::AvatarHashMap() : void AvatarHashMap::insert(const QUuid& id, AvatarSharedPointer avatar) { _avatarHash.insert(id, avatar); + avatar->setSessionID(id); } AvatarHash::iterator AvatarHashMap::erase(const AvatarHash::iterator& iterator) { From 8ad7c3b239c4b3998069414f8183f995105e00a6 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 8 Apr 2014 14:03:27 -0700 Subject: [PATCH 07/22] Moved ModelUploader to interface + New error messages --- .../src/ModelUploader.cpp | 80 +++++++++++-------- .../shared => interface}/src/ModelUploader.h | 4 +- 2 files changed, 48 insertions(+), 36 deletions(-) rename {libraries/shared => interface}/src/ModelUploader.cpp (82%) rename {libraries/shared => interface}/src/ModelUploader.h (94%) diff --git a/libraries/shared/src/ModelUploader.cpp b/interface/src/ModelUploader.cpp similarity index 82% rename from libraries/shared/src/ModelUploader.cpp rename to interface/src/ModelUploader.cpp index 4386704559..1881d84d85 100644 --- a/libraries/shared/src/ModelUploader.cpp +++ b/interface/src/ModelUploader.cpp @@ -18,7 +18,9 @@ #include #include -#include "AccountManager.h" +#include + +#include "renderer/FBXReader.h" #include "ModelUploader.h" @@ -59,11 +61,13 @@ bool ModelUploader::zip() { "Select your .fst file ...", QStandardPaths::writableLocation(QStandardPaths::HomeLocation), "*.fst"); - qDebug() << QStandardPaths::writableLocation(QStandardPaths::HomeLocation); if (filename == "") { // If the user canceled we return. return false; } + QString texDir; + QString fbxFile; + // First we check the FST file QFile fst(filename); @@ -100,22 +104,24 @@ bool ModelUploader::zip() { _dataMultiPart->append(textPart); _url = S3_URL + ((_isHead)? "/models/heads/" : "/models/skeletons/") + line[1].toUtf8() + ".fst"; } else if (line[0] == FILENAME_FIELD) { - QFileInfo fbx(QFileInfo(fst).path() + "/" + line[1]); - if (!fbx.exists() || !fbx.isFile()) { // Check existence + fbxFile = QFileInfo(fst).path() + "/" + line[1]; + QFileInfo fbxInfo(fbxFile); + if (!fbxInfo.exists() || !fbxInfo.isFile()) { // Check existence QMessageBox::warning(NULL, QString("ModelUploader::zip()"), - QString("FBX file %1 could not be found.").arg(fbx.fileName()), + QString("FBX file %1 could not be found.").arg(fbxInfo.fileName()), QMessageBox::Ok); - qDebug() << "[Warning] " << QString("FBX file %1 could not be found.").arg(fbx.fileName()); + qDebug() << "[Warning] " << QString("FBX file %1 could not be found.").arg(fbxInfo.fileName()); return false; } // Compress and copy - if (!addPart(fbx.filePath(), "fbx")) { + if (!addPart(fbxInfo.filePath(), "fbx")) { return false; } } else if (line[0] == TEXDIR_FIELD) { // Check existence - QFileInfo texdir(QFileInfo(fst).path() + "/" + line[1]); - if (!texdir.exists() || !texdir.isDir()) { + texDir = QFileInfo(fst).path() + "/" + line[1]; + QFileInfo texInfo(texDir); + if (!texInfo.exists() || !texInfo.isDir()) { QMessageBox::warning(NULL, QString("ModelUploader::zip()"), QString("Texture directory could not be found."), @@ -123,18 +129,14 @@ bool ModelUploader::zip() { qDebug() << "[Warning] " << QString("Texture directory could not be found."); return false; } - if (!addTextures(texdir)) { // Recursive compress and copy - return false; - } } else if (line[0] == LOD_FIELD) { QFileInfo lod(QFileInfo(fst).path() + "/" + line[1]); if (!lod.exists() || !lod.isFile()) { // Check existence QMessageBox::warning(NULL, QString("ModelUploader::zip()"), - QString("FBX file %1 could not be found.").arg(lod.fileName()), + QString("LOD file %1 could not be found.").arg(lod.fileName()), QMessageBox::Ok); qDebug() << "[Warning] " << QString("FBX file %1 could not be found.").arg(lod.fileName()); - return false; } // Compress and copy if (!addPart(lod.filePath(), QString("lod%1").arg(++_lodCount))) { @@ -143,6 +145,10 @@ bool ModelUploader::zip() { } } + if (!addTextures(texDir, fbxFile)) { + return false; + } + QHttpPart textPart; textPart.setHeader(QNetworkRequest::ContentDispositionHeader, "form-data;" " name=\"model_category\""); @@ -159,6 +165,7 @@ bool ModelUploader::zip() { void ModelUploader::send() { if (!zip()) { + deleteLater(); return; } @@ -202,7 +209,7 @@ void ModelUploader::uploadSuccess(const QJsonObject& jsonResponse) { } QMessageBox::information(NULL, QString("ModelUploader::uploadSuccess()"), - QString("Your model is being processed by the system."), + QString("We are reading your model information."), QMessageBox::Ok); qDebug() << "Model sent with success"; checkS3(); @@ -214,7 +221,7 @@ void ModelUploader::uploadFailed(QNetworkReply::NetworkError errorCode, const QS } QMessageBox::warning(NULL, QString("ModelUploader::uploadFailed()"), - QString("Model could not be sent to the data server."), + QString("There was a problem with your upload, please try again later."), QMessageBox::Ok); qDebug() << "Model upload failed (" << errorCode << "): " << errorString; deleteLater(); @@ -247,7 +254,8 @@ void ModelUploader::processCheck() { default: QMessageBox::warning(NULL, QString("ModelUploader::processCheck()"), - QString("Could not verify that the model is present on the server."), + QString("We could not verify that your model was sent sucessfully\n" + "but it may have. If you do not see it in the model browser, try to upload again."), QMessageBox::Ok); deleteLater(); break; @@ -256,24 +264,29 @@ void ModelUploader::processCheck() { delete reply; } -bool ModelUploader::addTextures(const QFileInfo& texdir) { - QStringList filter; - filter << "*.png" << "*.tif" << "*.jpg" << "*.jpeg"; +bool ModelUploader::addTextures(const QString& texdir, const QString fbxFile) { + QFile fbx(fbxFile); + if (!fbx.open(QIODevice::ReadOnly)) { + return false; + } - QFileInfoList list = QDir(texdir.filePath()).entryInfoList(filter, - QDir::Files | - QDir::AllDirs | - QDir::NoDotAndDotDot | - QDir::NoSymLinks); - foreach (QFileInfo info, list) { - if (info.isFile()) { - // Compress and copy - if (!addPart(info.filePath(), QString("texture%1").arg(++_texturesCount))) { - return false; + QByteArray buffer = fbx.readAll(); + QVariantHash variantHash = readMapping(buffer); + FBXGeometry geometry = readFBX(buffer, variantHash); + + foreach (FBXMesh mesh, geometry.meshes) { + foreach (FBXMeshPart part, mesh.parts) { + if (!part.diffuseFilename.isEmpty()) { + if (!addPart(QFileInfo(fbxFile).path() + "/" + part.diffuseFilename, + QString("texture%1").arg(++_texturesCount))) { + return false; + } } - } else if (info.isDir()) { - if (!addTextures(info)) { - return false; + if (!part.normalFilename.isEmpty()) { + if (!addPart(QFileInfo(fbxFile).path() + "/" + part.normalFilename, + QString("texture%1").arg(++_texturesCount))) { + return false; + } } } } @@ -282,6 +295,7 @@ bool ModelUploader::addTextures(const QFileInfo& texdir) { } bool ModelUploader::addPart(const QString &path, const QString& name) { + qDebug() << path; QFile file(path); if (!file.open(QIODevice::ReadOnly)) { QMessageBox::warning(NULL, diff --git a/libraries/shared/src/ModelUploader.h b/interface/src/ModelUploader.h similarity index 94% rename from libraries/shared/src/ModelUploader.h rename to interface/src/ModelUploader.h index 0e62ab8705..0d18ef9022 100644 --- a/libraries/shared/src/ModelUploader.h +++ b/interface/src/ModelUploader.h @@ -17,8 +17,6 @@ class QFileInfo; class QHttpMultiPart; class QProgressBar; -class TemporaryDir; - class ModelUploader : public QObject { Q_OBJECT @@ -55,7 +53,7 @@ private: bool zip(); - bool addTextures(const QFileInfo& texdir); + bool addTextures(const QString& texdir, const QString fbxFile); bool addPart(const QString& path, const QString& name); }; From 6754a6ca69f022ba8558aa5c3d85552abfe02429 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Tue, 8 Apr 2014 23:45:27 +0200 Subject: [PATCH 08/22] Fixed some style --- interface/src/Audio.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 7e7dfd9df1..597373ffe8 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -161,7 +161,8 @@ QAudioDeviceInfo defaultAudioDeviceForMode(QAudio::Mode mode) { ZeroMemory(&osvi, sizeof(OSVERSIONINFO)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&osvi); - if (osvi.dwMajorVersion < 6) {// lower then vista + const DWORD VISTA_MAJOR_VERSION = 6; + if (osvi.dwMajorVersion < VISTA_MAJOR_VERSION) {// lower then vista if (mode == QAudio::AudioInput) { WAVEINCAPS wic; // first use WAVE_MAPPER to get the default devices manufacturer ID @@ -182,11 +183,11 @@ QAudioDeviceInfo defaultAudioDeviceForMode(QAudio::Mode mode) { } else { HRESULT hr = S_OK; CoInitialize(NULL); - IMMDeviceEnumerator *pMMDeviceEnumerator = NULL; + IMMDeviceEnumerator* pMMDeviceEnumerator = NULL; CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&pMMDeviceEnumerator); - IMMDevice *pEndpoint; + IMMDevice* pEndpoint; pMMDeviceEnumerator->GetDefaultAudioEndpoint(mode == QAudio::AudioOutput ? eRender : eCapture, eMultimedia, &pEndpoint); - IPropertyStore *pPropertyStore; + IPropertyStore* pPropertyStore; pEndpoint->OpenPropertyStore(STGM_READ, &pPropertyStore); pEndpoint->Release(); pEndpoint = NULL; @@ -196,7 +197,8 @@ QAudioDeviceInfo defaultAudioDeviceForMode(QAudio::Mode mode) { pPropertyStore->Release(); pPropertyStore = NULL; //QAudio devices seems to only take the 31 first characters of the Friendly Device Name. - deviceName = QString::fromWCharArray((wchar_t *)pv.pwszVal).left(31); + const DWORD QT_WIN_MAX_AUDIO_DEVICENAME_LEN = 31; + deviceName = QString::fromWCharArray((wchar_t*)pv.pwszVal).left(QT_WIN_MAX_AUDIO_DEVICENAME_LEN); qDebug() << (mode == QAudio::AudioOutput ? "output" : "input") << " device:" << deviceName; PropVariantClear(&pv); pMMDeviceEnumerator->Release(); From 5776514e6a0943c9151d2676fa9e29ac1fa7486f Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Tue, 8 Apr 2014 14:48:01 -0700 Subject: [PATCH 09/22] Working on pushing the mirror camera back to prevent intersecting the near clip plane. Closes #2617. --- interface/src/Application.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 6bc8bb62df..db75034e7f 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -528,6 +528,16 @@ void Application::paintGL() { _myCamera.setDistance(MIRROR_FULLSCREEN_DISTANCE * _myAvatar->getScale()); _myCamera.setTargetPosition(_myAvatar->getPosition() + glm::vec3(0, headHeight, 0)); _myCamera.setTargetRotation(_myAvatar->getWorldAlignedOrientation() * glm::quat(glm::vec3(0.0f, PI, 0.0f))); + + // if the head would intersect the near clip plane, we must push the camera out + glm::vec3 relativePosition = glm::inverse(_myCamera.getTargetRotation()) * + (_myAvatar->getHead()->getPosition() - _myCamera.getTargetPosition()); + const float HEAD_RADIUS = 0.1f; + float pushback = relativePosition.z + _myCamera.getNearClip() + HEAD_RADIUS; + if (pushback > 0.0f) { + _myCamera.setTargetPosition(_myCamera.getTargetPosition() + + _myCamera.getTargetRotation() * glm::vec3(0.0f, 0.0f, pushback)); + } } // Update camera position From add7bb26ed4d731d8167b3c6eed21a358c4c8166 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Tue, 8 Apr 2014 14:55:46 -0700 Subject: [PATCH 10/22] Use the head height to determine the pushback amount. --- interface/src/Application.cpp | 4 ++-- interface/src/avatar/Avatar.cpp | 10 +++++----- interface/src/avatar/Avatar.h | 3 ++- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index db75034e7f..0b702c98a0 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -532,8 +532,8 @@ void Application::paintGL() { // if the head would intersect the near clip plane, we must push the camera out glm::vec3 relativePosition = glm::inverse(_myCamera.getTargetRotation()) * (_myAvatar->getHead()->getPosition() - _myCamera.getTargetPosition()); - const float HEAD_RADIUS = 0.1f; - float pushback = relativePosition.z + _myCamera.getNearClip() + HEAD_RADIUS; + const float HEAD_EXPANSION = 1.1f; + float pushback = relativePosition.z + _myCamera.getNearClip() + _myAvatar->getHeadHeight() * HEAD_EXPANSION; if (pushback > 0.0f) { _myCamera.setTargetPosition(_myCamera.getTargetPosition() + _myCamera.getTargetRotation() * glm::vec3(0.0f, 0.0f, pushback)); diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 05f74755df..86378c6cdf 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -524,6 +524,11 @@ void Avatar::updateShapePositions() { headModel.updateShapePositions(); } +float Avatar::getHeadHeight() const { + Extents extents = getHead()->getFaceModel().getBindExtents(); + return extents.maximum.y - extents.minimum.y; +} + bool Avatar::findCollisions(const QVector& shapes, CollisionList& collisions) { // TODO: Andrew to fix: also collide against _skeleton //bool collided = _skeletonModel.findCollisions(shapes, collisions); @@ -750,11 +755,6 @@ float Avatar::getSkeletonHeight() const { return extents.maximum.y - extents.minimum.y; } -float Avatar::getHeadHeight() const { - Extents extents = getHead()->getFaceModel().getBindExtents(); - return extents.maximum.y - extents.minimum.y; -} - bool Avatar::collisionWouldMoveAvatar(CollisionInfo& collision) const { if (!collision._data || collision._type != MODEL_COLLISION) { return false; diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index f57982b514..fca7173add 100755 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -151,6 +151,8 @@ public: virtual float getBoundingRadius() const; void updateShapePositions(); + float getHeadHeight() const; + public slots: void updateCollisionFlags(); @@ -179,7 +181,6 @@ protected: void setScale(float scale); float getSkeletonHeight() const; - float getHeadHeight() const; float getPelvisFloatingHeight() const; float getPelvisToHeadLength() const; From faf8c353588b0e6fe238f34c8633fcf762414a35 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Tue, 8 Apr 2014 15:01:56 -0700 Subject: [PATCH 11/22] Head height's kind of screwy; let's use the eye position. --- interface/src/Application.cpp | 9 +++++---- interface/src/avatar/Avatar.cpp | 10 +++++----- interface/src/avatar/Avatar.h | 3 +-- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 0b702c98a0..87cdaf8038 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -524,16 +524,17 @@ void Application::paintGL() { } else if (_myCamera.getMode() == CAMERA_MODE_MIRROR) { _myCamera.setTightness(0.0f); - float headHeight = _myAvatar->getHead()->calculateAverageEyePosition().y - _myAvatar->getPosition().y; + glm::vec3 eyePosition = _myAvatar->getHead()->calculateAverageEyePosition(); + float headHeight = eyePosition.y - _myAvatar->getPosition().y; _myCamera.setDistance(MIRROR_FULLSCREEN_DISTANCE * _myAvatar->getScale()); _myCamera.setTargetPosition(_myAvatar->getPosition() + glm::vec3(0, headHeight, 0)); _myCamera.setTargetRotation(_myAvatar->getWorldAlignedOrientation() * glm::quat(glm::vec3(0.0f, PI, 0.0f))); // if the head would intersect the near clip plane, we must push the camera out glm::vec3 relativePosition = glm::inverse(_myCamera.getTargetRotation()) * - (_myAvatar->getHead()->getPosition() - _myCamera.getTargetPosition()); - const float HEAD_EXPANSION = 1.1f; - float pushback = relativePosition.z + _myCamera.getNearClip() + _myAvatar->getHeadHeight() * HEAD_EXPANSION; + (eyePosition - _myCamera.getTargetPosition()); + const float PUSHBACK_RADIUS = 0.01f; + float pushback = relativePosition.z + _myCamera.getNearClip() + _myAvatar->getScale() * PUSHBACK_RADIUS; if (pushback > 0.0f) { _myCamera.setTargetPosition(_myCamera.getTargetPosition() + _myCamera.getTargetRotation() * glm::vec3(0.0f, 0.0f, pushback)); diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 86378c6cdf..05f74755df 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -524,11 +524,6 @@ void Avatar::updateShapePositions() { headModel.updateShapePositions(); } -float Avatar::getHeadHeight() const { - Extents extents = getHead()->getFaceModel().getBindExtents(); - return extents.maximum.y - extents.minimum.y; -} - bool Avatar::findCollisions(const QVector& shapes, CollisionList& collisions) { // TODO: Andrew to fix: also collide against _skeleton //bool collided = _skeletonModel.findCollisions(shapes, collisions); @@ -755,6 +750,11 @@ float Avatar::getSkeletonHeight() const { return extents.maximum.y - extents.minimum.y; } +float Avatar::getHeadHeight() const { + Extents extents = getHead()->getFaceModel().getBindExtents(); + return extents.maximum.y - extents.minimum.y; +} + bool Avatar::collisionWouldMoveAvatar(CollisionInfo& collision) const { if (!collision._data || collision._type != MODEL_COLLISION) { return false; diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index fca7173add..f57982b514 100755 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -151,8 +151,6 @@ public: virtual float getBoundingRadius() const; void updateShapePositions(); - float getHeadHeight() const; - public slots: void updateCollisionFlags(); @@ -181,6 +179,7 @@ protected: void setScale(float scale); float getSkeletonHeight() const; + float getHeadHeight() const; float getPelvisFloatingHeight() const; float getPelvisToHeadLength() const; From 083e9076a96ff7e3f8276a24144ddf6a3b2803b3 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Tue, 8 Apr 2014 15:17:05 -0700 Subject: [PATCH 12/22] Missed a spot. --- interface/src/Application.cpp | 3 ++- interface/src/Camera.h | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 87cdaf8038..a30ed648d8 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -534,7 +534,8 @@ void Application::paintGL() { glm::vec3 relativePosition = glm::inverse(_myCamera.getTargetRotation()) * (eyePosition - _myCamera.getTargetPosition()); const float PUSHBACK_RADIUS = 0.01f; - float pushback = relativePosition.z + _myCamera.getNearClip() + _myAvatar->getScale() * PUSHBACK_RADIUS; + float pushback = relativePosition.z + _myCamera.getNearClip() + + _myAvatar->getScale() * PUSHBACK_RADIUS - _myCamera.getDistance(); if (pushback > 0.0f) { _myCamera.setTargetPosition(_myCamera.getTargetPosition() + _myCamera.getTargetRotation() * glm::vec3(0.0f, 0.0f, pushback)); diff --git a/interface/src/Camera.h b/interface/src/Camera.h index 9973fd246e..3fd0efd50a 100644 --- a/interface/src/Camera.h +++ b/interface/src/Camera.h @@ -54,6 +54,7 @@ public: const glm::quat& getRotation() const { return _rotation; } CameraMode getMode() const { return _mode; } float getModeShiftPeriod() const { return _modeShiftPeriod; } + float getDistance() const { return _distance; } const glm::vec3& getTargetPosition() const { return _targetPosition; } const glm::quat& getTargetRotation() const { return _targetRotation; } float getFieldOfView() const { return _fieldOfView; } From 597d750af906117ca2cb71a1b8fb4675a5cad3d4 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Tue, 8 Apr 2014 15:25:10 -0700 Subject: [PATCH 13/22] Better radius. --- interface/src/Application.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index a30ed648d8..45ae36a23b 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -533,7 +533,7 @@ void Application::paintGL() { // if the head would intersect the near clip plane, we must push the camera out glm::vec3 relativePosition = glm::inverse(_myCamera.getTargetRotation()) * (eyePosition - _myCamera.getTargetPosition()); - const float PUSHBACK_RADIUS = 0.01f; + const float PUSHBACK_RADIUS = 0.2f; float pushback = relativePosition.z + _myCamera.getNearClip() + _myAvatar->getScale() * PUSHBACK_RADIUS - _myCamera.getDistance(); if (pushback > 0.0f) { From 94a7ded212fd1b3cf857ab9bc3cac56afae6ef33 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Tue, 8 Apr 2014 15:36:21 -0700 Subject: [PATCH 14/22] Slip in a fix for Windows build warnings on mtc-generated code. --- tools/mtc/src/main.cpp | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/tools/mtc/src/main.cpp b/tools/mtc/src/main.cpp index 9c77851961..b7e2929d49 100644 --- a/tools/mtc/src/main.cpp +++ b/tools/mtc/src/main.cpp @@ -143,13 +143,15 @@ void generateOutput (QTextStream& out, const QList& streamables) { out << " }\n"; out << " index = nextIndex;\n"; } - out << " switch (index) {\n"; - for (int i = 0; i < str.fields.size(); i++) { - out << " case " << i << ":\n"; - out << " this->" << str.fields.at(i).name << " = value.value<" << str.fields.at(i).type << ">();\n"; - out << " break;\n"; + if (!str.fields.isEmpty()) { + out << " switch (index) {\n"; + for (int i = 0; i < str.fields.size(); i++) { + out << " case " << i << ":\n"; + out << " this->" << str.fields.at(i).name << " = value.value<" << str.fields.at(i).type << ">();\n"; + out << " break;\n"; + } + out << " }\n"; } - out << " }\n"; out << "}\n"; out << "QVariant " << name << "::getField(int index) const {\n"; @@ -162,12 +164,14 @@ void generateOutput (QTextStream& out, const QList& streamables) { out << " }\n"; out << " index = nextIndex;\n"; } - out << " switch (index) {\n"; - for (int i = 0; i < str.fields.size(); i++) { - out << " case " << i << ":\n"; - out << " return QVariant::fromValue(this->" << str.fields.at(i).name << ");\n"; + if (!str.fields.isEmpty()) { + out << " switch (index) {\n"; + for (int i = 0; i < str.fields.size(); i++) { + out << " case " << i << ":\n"; + out << " return QVariant::fromValue(this->" << str.fields.at(i).name << ");\n"; + } + out << " }\n"; } - out << " }\n"; out << " return QVariant();\n"; out << "}\n"; From 039450aeec47ea58364de4b352d1320fe7bcc1eb Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 8 Apr 2014 16:35:07 -0700 Subject: [PATCH 15/22] Checking model name is present in the .fst file --- interface/src/ModelUploader.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/interface/src/ModelUploader.cpp b/interface/src/ModelUploader.cpp index 1881d84d85..93a2c96c7c 100644 --- a/interface/src/ModelUploader.cpp +++ b/interface/src/ModelUploader.cpp @@ -65,6 +65,7 @@ bool ModelUploader::zip() { // If the user canceled we return. return false; } + bool _nameIsPresent = false; QString texDir; QString fbxFile; @@ -103,6 +104,7 @@ bool ModelUploader::zip() { textPart.setBody(line[1].toUtf8()); _dataMultiPart->append(textPart); _url = S3_URL + ((_isHead)? "/models/heads/" : "/models/skeletons/") + line[1].toUtf8() + ".fst"; + _nameIsPresent = true; } else if (line[0] == FILENAME_FIELD) { fbxFile = QFileInfo(fst).path() + "/" + line[1]; QFileInfo fbxInfo(fbxFile); @@ -159,6 +161,15 @@ bool ModelUploader::zip() { } _dataMultiPart->append(textPart); + if (!_nameIsPresent) { + QMessageBox::warning(NULL, + QString("ModelUploader::zip()"), + QString("Model name is missing in the .fst file."), + QMessageBox::Ok); + qDebug() << "[Warning] " << QString("Model name is missing in the .fst file."); + return false; + } + _readyToSend = true; return true; } From b8232b5dfdc70db8cc811dce1815bb5e1ac2c60b Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 9 Apr 2014 08:11:15 -0700 Subject: [PATCH 16/22] AvatarData now stores sessionUUID --- interface/src/Application.cpp | 5 ++++- libraries/avatars/src/AvatarData.cpp | 1 + libraries/avatars/src/AvatarData.h | 8 +++++--- libraries/avatars/src/AvatarHashMap.cpp | 2 +- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 15d45b614d..f8aaf45f7c 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1205,7 +1205,10 @@ void Application::timer() { // ask the node list to check in with the domain server NodeList::getInstance()->sendDomainServerCheckIn(); - + // as soon as we have a valid sessionUUID, store it in the avatar for reference + if (_myAvatar->getSessionUUID().isNull()) { + _myAvatar->setSessionUUID(NodeList::getInstance()->getSessionUUID()); + } } void Application::idle() { diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 930e3f7350..7bdd8fb752 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -32,6 +32,7 @@ using namespace std; QNetworkAccessManager* AvatarData::networkAccessManager = NULL; AvatarData::AvatarData() : + _sessionUUID(), _handPosition(0,0,0), _bodyYaw(-90.f), _bodyPitch(0.0f), diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 2637b5a0c3..0f4df39f87 100755 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -94,12 +94,14 @@ class AvatarData : public QObject { Q_PROPERTY(QString faceModelURL READ getFaceModelURLFromScript WRITE setFaceModelURLFromScript) Q_PROPERTY(QString skeletonModelURL READ getSkeletonModelURLFromScript WRITE setSkeletonModelURLFromScript) Q_PROPERTY(QString billboardURL READ getBillboardURL WRITE setBillboardFromURL) + + Q_PROPERTY(QUuid sessionUUID READ getSessionUUID); public: AvatarData(); virtual ~AvatarData(); - const QUuid& getSessionID() { return _sessionID; } - void setSessionID(const QUuid& id) { _sessionID = id; } + const QUuid& getSessionUUID() { return _sessionUUID; } + void setSessionUUID(const QUuid& id) { _sessionUUID = id; } const glm::vec3& getPosition() const { return _position; } void setPosition(const glm::vec3 position) { _position = position; } @@ -222,7 +224,7 @@ public slots: void sendBillboardPacket(); void setBillboardFromNetworkReply(); protected: - QUuid _sessionID; + QUuid _sessionUUID; glm::vec3 _position; glm::vec3 _handPosition; diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index 5a56e3d5dc..3dd5c9991f 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -15,7 +15,7 @@ AvatarHashMap::AvatarHashMap() : void AvatarHashMap::insert(const QUuid& id, AvatarSharedPointer avatar) { _avatarHash.insert(id, avatar); - avatar->setSessionID(id); + avatar->setSessionUUID(id); } AvatarHash::iterator AvatarHashMap::erase(const AvatarHash::iterator& iterator) { From 2f97dd2574e617454046de514ad1aaaca0281fec Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 9 Apr 2014 08:22:35 -0700 Subject: [PATCH 17/22] sessionID --> sessionUUID for consistency --- interface/src/avatar/AvatarManager.cpp | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 5b98d933ff..fbbaad4e84 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -123,8 +123,8 @@ void AvatarManager::renderAvatarFades(const glm::vec3& cameraPosition, Avatar::R } } -AvatarSharedPointer AvatarManager::matchingOrNewAvatar(const QUuid& sessionID, const QWeakPointer& mixerWeakPointer) { - AvatarSharedPointer matchingAvatar = _avatarHash.value(sessionID); +AvatarSharedPointer AvatarManager::matchingOrNewAvatar(const QUuid& sessionUUID, const QWeakPointer& mixerWeakPointer) { + AvatarSharedPointer matchingAvatar = _avatarHash.value(sessionUUID); if (!matchingAvatar) { // construct a new Avatar for this node @@ -133,9 +133,9 @@ AvatarSharedPointer AvatarManager::matchingOrNewAvatar(const QUuid& sessionID, c // insert the new avatar into our hash matchingAvatar = AvatarSharedPointer(avatar); - _avatarHash.insert(sessionID, matchingAvatar); + _avatarHash.insert(sessionUUID, matchingAvatar); - qDebug() << "Adding avatar with sessionID " << sessionID << "to AvatarManager hash."; + qDebug() << "Adding avatar with sessionUUID " << sessionUUID << "to AvatarManager hash."; } return matchingAvatar; @@ -166,10 +166,10 @@ void AvatarManager::processAvatarDataPacket(const QByteArray &datagram, const QW // enumerate over all of the avatars in this packet // only add them if mixerWeakPointer points to something (meaning that mixer is still around) while (bytesRead < datagram.size() && mixerWeakPointer.data()) { - QUuid sessionID = QUuid::fromRfc4122(datagram.mid(bytesRead, NUM_BYTES_RFC4122_UUID)); + QUuid sessionUUID = QUuid::fromRfc4122(datagram.mid(bytesRead, NUM_BYTES_RFC4122_UUID)); bytesRead += NUM_BYTES_RFC4122_UUID; - AvatarSharedPointer matchingAvatarData = matchingOrNewAvatar(sessionID, mixerWeakPointer); + AvatarSharedPointer matchingAvatarData = matchingOrNewAvatar(sessionUUID, mixerWeakPointer); // have the matching (or new) avatar parse the data from the packet bytesRead += matchingAvatarData->parseDataAtOffset(datagram, bytesRead); @@ -188,16 +188,16 @@ void AvatarManager::processAvatarIdentityPacket(const QByteArray &packet, const QDataStream identityStream(packet); identityStream.skipRawData(numBytesForPacketHeader(packet)); - QUuid sessionID; + QUuid sessionUUID; while (!identityStream.atEnd()) { QUrl faceMeshURL, skeletonURL; QString displayName; - identityStream >> sessionID >> faceMeshURL >> skeletonURL >> displayName; + identityStream >> sessionUUID >> faceMeshURL >> skeletonURL >> displayName; // mesh URL for a UUID, find avatar in our list - AvatarSharedPointer matchingAvatar = matchingOrNewAvatar(sessionID, mixerWeakPointer); + AvatarSharedPointer matchingAvatar = matchingOrNewAvatar(sessionUUID, mixerWeakPointer); if (matchingAvatar) { Avatar* avatar = static_cast(matchingAvatar.data()); @@ -218,9 +218,9 @@ void AvatarManager::processAvatarIdentityPacket(const QByteArray &packet, const void AvatarManager::processAvatarBillboardPacket(const QByteArray& packet, const QWeakPointer& mixerWeakPointer) { int headerSize = numBytesForPacketHeader(packet); - QUuid sessionID = QUuid::fromRfc4122(QByteArray::fromRawData(packet.constData() + headerSize, NUM_BYTES_RFC4122_UUID)); + QUuid sessionUUID = QUuid::fromRfc4122(QByteArray::fromRawData(packet.constData() + headerSize, NUM_BYTES_RFC4122_UUID)); - AvatarSharedPointer matchingAvatar = matchingOrNewAvatar(sessionID, mixerWeakPointer); + AvatarSharedPointer matchingAvatar = matchingOrNewAvatar(sessionUUID, mixerWeakPointer); if (matchingAvatar) { Avatar* avatar = static_cast(matchingAvatar.data()); QByteArray billboard = packet.mid(headerSize + NUM_BYTES_RFC4122_UUID); @@ -232,10 +232,10 @@ void AvatarManager::processAvatarBillboardPacket(const QByteArray& packet, const void AvatarManager::processKillAvatar(const QByteArray& datagram) { // read the node id - QUuid sessionID = QUuid::fromRfc4122(datagram.mid(numBytesForPacketHeader(datagram), NUM_BYTES_RFC4122_UUID)); + QUuid sessionUUID = QUuid::fromRfc4122(datagram.mid(numBytesForPacketHeader(datagram), NUM_BYTES_RFC4122_UUID)); // remove the avatar with that UUID from our hash, if it exists - AvatarHash::iterator matchedAvatar = _avatarHash.find(sessionID); + AvatarHash::iterator matchedAvatar = _avatarHash.find(sessionUUID); if (matchedAvatar != _avatarHash.end()) { erase(matchedAvatar); } From ce85e67a42c6f520844ce4cf73266ba50e9377df Mon Sep 17 00:00:00 2001 From: stojce Date: Wed, 9 Apr 2014 18:54:59 +0200 Subject: [PATCH 18/22] Modify icons in Interface "mirror" --- interface/resources/images/audio-box.svg | 12 +++ interface/resources/images/body.png | Bin 4801 -> 0 bytes interface/resources/images/close.png | Bin 3817 -> 0 bytes interface/resources/images/close.svg | 26 +++-- interface/resources/images/head.png | Bin 4453 -> 0 bytes interface/resources/images/mic-mute.svg | 115 +++++++++++++++++++++ interface/resources/images/mic.svg | 121 +++++++++++++++++++---- interface/resources/images/minus.svg | 11 +++ interface/resources/images/mute.svg | 20 ---- interface/resources/images/plus.svg | 12 +++ interface/src/Application.cpp | 25 +++-- interface/src/Audio.cpp | 69 ++++++++----- interface/src/Audio.h | 3 +- interface/src/ui/RearMirrorTools.cpp | 31 +++--- 14 files changed, 348 insertions(+), 97 deletions(-) create mode 100644 interface/resources/images/audio-box.svg delete mode 100644 interface/resources/images/body.png delete mode 100644 interface/resources/images/close.png delete mode 100644 interface/resources/images/head.png create mode 100644 interface/resources/images/mic-mute.svg create mode 100644 interface/resources/images/minus.svg delete mode 100644 interface/resources/images/mute.svg create mode 100644 interface/resources/images/plus.svg diff --git a/interface/resources/images/audio-box.svg b/interface/resources/images/audio-box.svg new file mode 100644 index 0000000000..0c0db4f51f --- /dev/null +++ b/interface/resources/images/audio-box.svg @@ -0,0 +1,12 @@ + + + Slice 1 + Created with Sketch (http://www.bohemiancoding.com/sketch) + + + + + + + + \ No newline at end of file diff --git a/interface/resources/images/body.png b/interface/resources/images/body.png deleted file mode 100644 index dda65bad07774cab5372349673b487775b22baa0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4801 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 D(=uVu diff --git a/interface/resources/images/close.png b/interface/resources/images/close.png deleted file mode 100644 index 8090e3d3d090a60ec2e8b0591b6e088baef2db03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3817 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 f;4| - - - - - - - - - + + + Slice 1 + Created with Sketch (http://www.bohemiancoding.com/sketch) + + + + + + + + \ No newline at end of file diff --git a/interface/resources/images/head.png b/interface/resources/images/head.png deleted file mode 100644 index d21b453beef1d2cb597665bfb4abc647be1de990..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4453 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 + + +image/svg+xml + + + + + + + + Mic + Created with Sketch (http://www.bohemiancoding.com/sketch) + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/interface/resources/images/mic.svg b/interface/resources/images/mic.svg index a6dee50740..3329f19647 100644 --- a/interface/resources/images/mic.svg +++ b/interface/resources/images/mic.svg @@ -1,20 +1,105 @@ - - Mic - Created with Sketch (http://www.bohemiancoding.com/sketch) - - - - - - - - - - - - - - - + + +image/svg+xml + + + + + + + + Mic + Created with Sketch (http://www.bohemiancoding.com/sketch) + + + + + + + + + + + + + + \ No newline at end of file diff --git a/interface/resources/images/minus.svg b/interface/resources/images/minus.svg new file mode 100644 index 0000000000..463b24aa4c --- /dev/null +++ b/interface/resources/images/minus.svg @@ -0,0 +1,11 @@ + + + Slice 1 + Created with Sketch (http://www.bohemiancoding.com/sketch) + + + + + + + \ No newline at end of file diff --git a/interface/resources/images/mute.svg b/interface/resources/images/mute.svg deleted file mode 100644 index 1f1b238463..0000000000 --- a/interface/resources/images/mute.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - mute - Created with Sketch (http://www.bohemiancoding.com/sketch) - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/interface/resources/images/plus.svg b/interface/resources/images/plus.svg new file mode 100644 index 0000000000..6efaa31abc --- /dev/null +++ b/interface/resources/images/plus.svg @@ -0,0 +1,12 @@ + + + Slice 1 + Created with Sketch (http://www.bohemiancoding.com/sketch) + + + + + + + + \ No newline at end of file diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index d54cceb245..deaab1ac10 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2503,20 +2503,19 @@ void Application::displayOverlay() { // Audio VU Meter and Mute Icon const int MUTE_ICON_SIZE = 24; const int AUDIO_METER_INSET = 2; - const int AUDIO_METER_WIDTH = MIRROR_VIEW_WIDTH - MUTE_ICON_SIZE - AUDIO_METER_INSET; + const int MUTE_ICON_PADDING = 10; + const int AUDIO_METER_WIDTH = MIRROR_VIEW_WIDTH - MUTE_ICON_SIZE - AUDIO_METER_INSET - MUTE_ICON_PADDING; const int AUDIO_METER_SCALE_WIDTH = AUDIO_METER_WIDTH - 2 * AUDIO_METER_INSET; const int AUDIO_METER_HEIGHT = 8; - const int AUDIO_METER_Y_GAP = 8; - const int AUDIO_METER_X = MIRROR_VIEW_LEFT_PADDING + MUTE_ICON_SIZE + AUDIO_METER_INSET; + const int AUDIO_METER_GAP = 5; + const int AUDIO_METER_X = MIRROR_VIEW_LEFT_PADDING + MUTE_ICON_SIZE + AUDIO_METER_INSET + AUDIO_METER_GAP; int audioMeterY; if (Menu::getInstance()->isOptionChecked(MenuOption::Mirror)) { - audioMeterY = MIRROR_VIEW_HEIGHT + AUDIO_METER_Y_GAP; + audioMeterY = MIRROR_VIEW_HEIGHT + AUDIO_METER_GAP + MUTE_ICON_PADDING; } else { - audioMeterY = AUDIO_METER_Y_GAP; + audioMeterY = AUDIO_METER_GAP + MUTE_ICON_PADDING; } - _audio.renderMuteIcon(MIRROR_VIEW_LEFT_PADDING, audioMeterY); - const float AUDIO_METER_BLUE[] = {0.0, 0.0, 1.0}; const float AUDIO_METER_GREEN[] = {0.0, 1.0, 0.0}; @@ -2545,18 +2544,27 @@ void Application::displayOverlay() { bool isClipping = ((_audio.getTimeSinceLastClip() > 0.f) && (_audio.getTimeSinceLastClip() < CLIPPING_INDICATOR_TIME)); + _audio.renderToolBox(MIRROR_VIEW_LEFT_PADDING + AUDIO_METER_GAP, + audioMeterY, + Menu::getInstance()->isOptionChecked(MenuOption::Mirror)); + glBegin(GL_QUADS); if (isClipping) { glColor3f(1, 0, 0); } else { - glColor3f(0, 0, 0); + glColor3f(0.475f, 0.475f, 0.475f); } + + audioMeterY += AUDIO_METER_HEIGHT; + + glColor3f(0, 0, 0); // Draw audio meter background Quad glVertex2i(AUDIO_METER_X, audioMeterY); glVertex2i(AUDIO_METER_X + AUDIO_METER_WIDTH, audioMeterY); glVertex2i(AUDIO_METER_X + AUDIO_METER_WIDTH, audioMeterY + AUDIO_METER_HEIGHT); glVertex2i(AUDIO_METER_X, audioMeterY + AUDIO_METER_HEIGHT); + if (audioLevel > AUDIO_RED_START) { if (!isClipping) { glColor3fv(AUDIO_METER_RED); @@ -2596,6 +2604,7 @@ void Application::displayOverlay() { glVertex2i(AUDIO_METER_X + AUDIO_METER_INSET, audioMeterY + AUDIO_METER_HEIGHT - AUDIO_METER_INSET); glEnd(); + if (Menu::getInstance()->isOptionChecked(MenuOption::HeadMouse)) { _myAvatar->renderHeadMouse(); } diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 63c683dbb0..4843b2f462 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -86,7 +86,8 @@ Audio::Audio(Oscilloscope* scope, int16_t initialJitterBufferSamples, QObject* p void Audio::init(QGLWidget *parent) { _micTextureId = parent->bindTexture(QImage(Application::resourcesPath() + "images/mic.svg")); - _muteTextureId = parent->bindTexture(QImage(Application::resourcesPath() + "images/mute.svg")); + _muteTextureId = parent->bindTexture(QImage(Application::resourcesPath() + "images/mic-mute.svg")); + _boxTextureId = parent->bindTexture(QImage(Application::resourcesPath() + "images/audio-box.svg")); } void Audio::reset() { @@ -817,13 +818,52 @@ void Audio::handleAudioByteArray(const QByteArray& audioByteArray) { // or send to the mixer and use delayed loopback } -void Audio::renderMuteIcon(int x, int y) { +void Audio::renderToolBox(int x, int y, bool boxed) { - _iconBounds = QRect(x, y, MUTE_ICON_SIZE, MUTE_ICON_SIZE); glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, _micTextureId); - glColor3f(.93f, .93f, .93f); + if (boxed) { + + bool isClipping = ((getTimeSinceLastClip() > 0.f) && (getTimeSinceLastClip() < 1.f)); + const int BOX_LEFT_PADDING = 5; + const int BOX_TOP_PADDING = 10; + const int BOX_WIDTH = 266; + const int BOX_HEIGHT = 44; + + QRect boxBounds = QRect(x - BOX_LEFT_PADDING, y - BOX_TOP_PADDING, BOX_WIDTH, BOX_HEIGHT); + + glBindTexture(GL_TEXTURE_2D, _boxTextureId); + + if (isClipping) { + glColor3f(1.f,0.f,0.f); + } else { + glColor3f(.41f,.41f,.41f); + } + glBegin(GL_QUADS); + + glTexCoord2f(1, 1); + glVertex2f(boxBounds.left(), boxBounds.top()); + + glTexCoord2f(0, 1); + glVertex2f(boxBounds.right(), boxBounds.top()); + + glTexCoord2f(0, 0); + glVertex2f(boxBounds.right(), boxBounds.bottom()); + + glTexCoord2f(1, 0); + glVertex2f(boxBounds.left(), boxBounds.bottom()); + + glEnd(); + } + + _iconBounds = QRect(x, y, MUTE_ICON_SIZE, MUTE_ICON_SIZE); + if (!_muted) { + glBindTexture(GL_TEXTURE_2D, _micTextureId); + } else { + glBindTexture(GL_TEXTURE_2D, _muteTextureId); + } + + glColor3f(1,1,1); glBegin(GL_QUADS); glTexCoord2f(1, 1); @@ -840,25 +880,6 @@ void Audio::renderMuteIcon(int x, int y) { glEnd(); - if (_muted) { - glBindTexture(GL_TEXTURE_2D, _muteTextureId); - glBegin(GL_QUADS); - - glTexCoord2f(1, 1); - glVertex2f(_iconBounds.left(), _iconBounds.top()); - - glTexCoord2f(0, 1); - glVertex2f(_iconBounds.right(), _iconBounds.top()); - - glTexCoord2f(0, 0); - glVertex2f(_iconBounds.right(), _iconBounds.bottom()); - - glTexCoord2f(1, 0); - glVertex2f(_iconBounds.left(), _iconBounds.bottom()); - - glEnd(); - } - glDisable(GL_TEXTURE_2D); } diff --git a/interface/src/Audio.h b/interface/src/Audio.h index 88488922f3..c6a3619865 100644 --- a/interface/src/Audio.h +++ b/interface/src/Audio.h @@ -69,7 +69,7 @@ public: void init(QGLWidget *parent = 0); bool mousePressEvent(int x, int y); - void renderMuteIcon(int x, int y); + void renderToolBox(int x, int y, bool boxed); int getNetworkSampleRate() { return SAMPLE_RATE; } int getNetworkBufferLengthSamplesPerChannel() { return NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL; } @@ -161,6 +161,7 @@ private: bool _localEcho; GLuint _micTextureId; GLuint _muteTextureId; + GLuint _boxTextureId; QRect _iconBounds; // Audio callback in class context. diff --git a/interface/src/ui/RearMirrorTools.cpp b/interface/src/ui/RearMirrorTools.cpp index 314fd7157b..07503c8cb2 100644 --- a/interface/src/ui/RearMirrorTools.cpp +++ b/interface/src/ui/RearMirrorTools.cpp @@ -18,9 +18,8 @@ const char SETTINGS_GROUP_NAME[] = "Rear View Tools"; const char ZOOM_LEVEL_SETTINGS[] = "ZoomLevel"; -const int ICON_SIZE = 20; +const int ICON_SIZE = 24; const int ICON_PADDING = 5; -const int MID_ICON_PADDING = 70; RearMirrorTools::RearMirrorTools(QGLWidget* parent, QRect& bounds, QSettings* settings) : _parent(parent), @@ -29,16 +28,19 @@ RearMirrorTools::RearMirrorTools(QGLWidget* parent, QRect& bounds, QSettings* se _fullScreen(false) { _zoomLevel = HEAD; - _closeTextureId = _parent->bindTexture(QImage(Application::resourcesPath() + "images/close.png")); - _resetTextureId = _parent->bindTexture(QImage(Application::resourcesPath() + "images/reset.png")); - _zoomHeadTextureId = _parent->bindTexture(QImage(Application::resourcesPath() + "images/head.png")); - _zoomBodyTextureId = _parent->bindTexture(QImage(Application::resourcesPath() + "images/body.png")); + _closeTextureId = _parent->bindTexture(QImage(Application::resourcesPath() + "images/close.svg")); + + // Disabled for now https://worklist.net/19548 + // _resetTextureId = _parent->bindTexture(QImage(Application::resourcesPath() + "images/reset.png")); + + _zoomHeadTextureId = _parent->bindTexture(QImage(Application::resourcesPath() + "images/plus.svg")); + _zoomBodyTextureId = _parent->bindTexture(QImage(Application::resourcesPath() + "images/minus.svg")); _shrinkIconRect = QRect(ICON_PADDING, ICON_PADDING, ICON_SIZE, ICON_SIZE); _closeIconRect = QRect(_bounds.left() + ICON_PADDING, _bounds.top() + ICON_PADDING, ICON_SIZE, ICON_SIZE); _resetIconRect = QRect(_bounds.width() - ICON_SIZE - ICON_PADDING, _bounds.top() + ICON_PADDING, ICON_SIZE, ICON_SIZE); - _bodyZoomIconRect = QRect(_bounds.width() - MID_ICON_PADDING - ICON_SIZE, _bounds.bottom() - ICON_PADDING - ICON_SIZE, ICON_SIZE, ICON_SIZE); - _headZoomIconRect = QRect(_bounds.left() + MID_ICON_PADDING, _bounds.bottom() - ICON_PADDING - ICON_SIZE, ICON_SIZE, ICON_SIZE); + _bodyZoomIconRect = QRect(_bounds.width() - ICON_SIZE - ICON_PADDING, _bounds.bottom() - ICON_PADDING - ICON_SIZE, ICON_SIZE, ICON_SIZE); + _headZoomIconRect = QRect(_bounds.left() + ICON_PADDING, _bounds.bottom() - ICON_PADDING - ICON_SIZE, ICON_SIZE, ICON_SIZE); settings->beginGroup(SETTINGS_GROUP_NAME); _zoomLevel = loadSetting(settings, ZOOM_LEVEL_SETTINGS, 0) == HEAD ? HEAD : BODY; @@ -55,7 +57,10 @@ void RearMirrorTools::render(bool fullScreen) { _windowed = _bounds.contains(mousePosition.x(), mousePosition.y()); if (_windowed) { displayIcon(_bounds, _closeIconRect, _closeTextureId); - displayIcon(_bounds, _resetIconRect, _resetTextureId); + + // Disabled for now https://worklist.net/19548 + // displayIcon(_bounds, _resetIconRect, _resetTextureId); + displayIcon(_bounds, _headZoomIconRect, _zoomHeadTextureId, _zoomLevel == HEAD); displayIcon(_bounds, _bodyZoomIconRect, _zoomBodyTextureId, _zoomLevel == BODY); } @@ -69,11 +74,13 @@ bool RearMirrorTools::mousePressEvent(int x, int y) { emit closeView(); return true; } - + + /* Disabled for now https://worklist.net/19548 if (_resetIconRect.contains(x, y)) { emit resetView(); return true; } + */ if (_headZoomIconRect.contains(x, y)) { _zoomLevel = HEAD; @@ -84,7 +91,7 @@ bool RearMirrorTools::mousePressEvent(int x, int y) { _zoomLevel = BODY; return true; } - + if (_bounds.contains(x, y)) { _windowed = false; emit restoreView(); @@ -120,7 +127,7 @@ void RearMirrorTools::displayIcon(QRect bounds, QRect iconBounds, GLuint texture glEnable(GL_TEXTURE_2D); if (selected) { - glColor3f(1, 1, 0); + glColor3f(.5f, .5f, .5f); } else { glColor3f(1, 1, 1); } From 4b306401afd026e8a737af85d0520988c9998c9b Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 9 Apr 2014 11:32:52 -0700 Subject: [PATCH 19/22] use slot to change AvatarData::_sessionUUID --- interface/src/Application.cpp | 6 +----- libraries/avatars/src/AvatarData.h | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 2a97e536e4..ae80cdef48 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -232,6 +232,7 @@ Application::Application(int& argc, char** argv, timeval &startup_time) : connect(nodeList, SIGNAL(nodeAdded(SharedNodePointer)), &_voxels, SLOT(nodeAdded(SharedNodePointer))); connect(nodeList, SIGNAL(nodeKilled(SharedNodePointer)), &_voxels, SLOT(nodeKilled(SharedNodePointer))); connect(nodeList, &NodeList::uuidChanged, this, &Application::updateWindowTitle); + connect(nodeList, SIGNAL(uuidChanged(const QUuid&)), _myAvatar, SLOT(setSessionUUID(const QUuid&))); connect(nodeList, &NodeList::limitOfSilentDomainCheckInsReached, nodeList, &NodeList::reset); // connect to appropriate slots on AccountManager @@ -1216,11 +1217,6 @@ void Application::timer() { // ask the node list to check in with the domain server NodeList::getInstance()->sendDomainServerCheckIn(); - - // as soon as we have a valid sessionUUID, store it in the avatar for reference - if (_myAvatar->getSessionUUID().isNull()) { - _myAvatar->setSessionUUID(NodeList::getInstance()->getSessionUUID()); - } } void Application::idle() { diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index e8b287ceed..2b8dfe8861 100755 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -102,7 +102,6 @@ public: virtual ~AvatarData(); const QUuid& getSessionUUID() { return _sessionUUID; } - void setSessionUUID(const QUuid& id) { _sessionUUID = id; } const glm::vec3& getPosition() const { return _position; } void setPosition(const glm::vec3 position) { _position = position; } @@ -225,6 +224,7 @@ public slots: void sendBillboardPacket(); void setBillboardFromNetworkReply(); void setJointMappingsFromNetworkReply(); + void setSessionUUID(const QUuid& id) { _sessionUUID = id; } protected: QUuid _sessionUUID; glm::vec3 _position; From 7304049f83df687ea9df7b11b5e7e4fa8c4011f2 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 9 Apr 2014 12:55:29 -0700 Subject: [PATCH 20/22] update boiler plate to abide by new standard --- libraries/script-engine/src/ScriptUUID.cpp | 11 ++++++++--- libraries/script-engine/src/ScriptUUID.h | 19 +++++++++++-------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/libraries/script-engine/src/ScriptUUID.cpp b/libraries/script-engine/src/ScriptUUID.cpp index cea7247e90..f19ed99417 100644 --- a/libraries/script-engine/src/ScriptUUID.cpp +++ b/libraries/script-engine/src/ScriptUUID.cpp @@ -1,10 +1,15 @@ // -// ScriptUUID.h -// hifi +// ScriptUUID.cpp +// libraries/script-engine/src/ // -// Created by Andrew Meadows on 2014.04.07 +// Created by Andrew Meadows on 2014-04-07 // Copyright (c) 2014 High Fidelity, Inc. All rights reserved. // +// Scriptable interface for a UUID helper class object. Used exclusively in the JavaScript API +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// #include diff --git a/libraries/script-engine/src/ScriptUUID.h b/libraries/script-engine/src/ScriptUUID.h index 43e885cf98..32ab40a106 100644 --- a/libraries/script-engine/src/ScriptUUID.h +++ b/libraries/script-engine/src/ScriptUUID.h @@ -1,17 +1,22 @@ // // ScriptUUID.h -// hifi +// libraries/script-engine/src/ // -// Created by Andrew Meadows on 2014.04.07 +// Created by Andrew Meadows on 2014-04-07 // Copyright (c) 2014 High Fidelity, Inc. All rights reserved. // +// Scriptable interface for a UUID helper class object. Used exclusively in the JavaScript API +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// -#ifndef __hifi__ScriptUUID__ -#define __hifi__ScriptUUID__ +#ifndef hifi_ScriptUUID_h +#define hifi_ScriptUUID_h #include -/// Scriptable interface a UUID helper class object. Used exclusively in the JavaScript API +/// Scriptable interface for a UUID helper class object. Used exclusively in the JavaScript API class ScriptUUID : public QObject { Q_OBJECT @@ -24,6 +29,4 @@ public slots: void print(const QString& lable, const QUuid& id); }; - - -#endif /* defined(__hifi__Vec3__) */ +#endif // hifi_ScriptUUID_h From 698e3783e0fb05fb172424c3459f0d1a81bc77a0 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 9 Apr 2014 13:06:29 -0700 Subject: [PATCH 21/22] fixing formatting --- libraries/script-engine/src/ScriptUUID.cpp | 2 +- libraries/script-engine/src/ScriptUUID.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/script-engine/src/ScriptUUID.cpp b/libraries/script-engine/src/ScriptUUID.cpp index f19ed99417..9e00f9c095 100644 --- a/libraries/script-engine/src/ScriptUUID.cpp +++ b/libraries/script-engine/src/ScriptUUID.cpp @@ -5,7 +5,7 @@ // Created by Andrew Meadows on 2014-04-07 // Copyright (c) 2014 High Fidelity, Inc. All rights reserved. // -// Scriptable interface for a UUID helper class object. Used exclusively in the JavaScript API +// Scriptable interface for a UUID helper class object. Used exclusively in the JavaScript API // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html diff --git a/libraries/script-engine/src/ScriptUUID.h b/libraries/script-engine/src/ScriptUUID.h index 32ab40a106..db94b5082b 100644 --- a/libraries/script-engine/src/ScriptUUID.h +++ b/libraries/script-engine/src/ScriptUUID.h @@ -5,7 +5,7 @@ // Created by Andrew Meadows on 2014-04-07 // Copyright (c) 2014 High Fidelity, Inc. All rights reserved. // -// Scriptable interface for a UUID helper class object. Used exclusively in the JavaScript API +// Scriptable interface for a UUID helper class object. Used exclusively in the JavaScript API // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html From 7578b282e296c2e79d654dba5c384f2e764483d8 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 9 Apr 2014 14:12:11 -0700 Subject: [PATCH 22/22] CR --- interface/src/ModelUploader.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/interface/src/ModelUploader.cpp b/interface/src/ModelUploader.cpp index 93a2c96c7c..3f496c9890 100644 --- a/interface/src/ModelUploader.cpp +++ b/interface/src/ModelUploader.cpp @@ -306,7 +306,6 @@ bool ModelUploader::addTextures(const QString& texdir, const QString fbxFile) { } bool ModelUploader::addPart(const QString &path, const QString& name) { - qDebug() << path; QFile file(path); if (!file.open(QIODevice::ReadOnly)) { QMessageBox::warning(NULL,