diff --git a/libraries/avatars/CMakeLists.txt b/libraries/avatars/CMakeLists.txt index 0570c30725..eb681ee93c 100644 --- a/libraries/avatars/CMakeLists.txt +++ b/libraries/avatars/CMakeLists.txt @@ -22,4 +22,4 @@ include(${MACRO_DIR}/LinkHifiLibrary.cmake) link_hifi_library(shared ${TARGET_NAME} ${ROOT_DIR}) # link in the hifi voxels library -link_hifi_library(voxels ${TARGET_NAME} ${ROOT_DIR}) +link_hifi_library(voxels ${TARGET_NAME} ${ROOT_DIR}) \ No newline at end of file diff --git a/libraries/avatars/src/Agent.cpp b/libraries/avatars/src/Agent.cpp index 30443e212c..af1ac69b74 100644 --- a/libraries/avatars/src/Agent.cpp +++ b/libraries/avatars/src/Agent.cpp @@ -9,11 +9,21 @@ #import #import +#include + #include "AvatarData.h" #include "Agent.h" +Agent::Agent() : + _shouldStop(false) +{ + +} + void Agent::run(QUrl scriptURL) { + NodeList::getInstance()->setOwnerType(NODE_TYPE_AGENT); + NodeList::getInstance()->setNodeTypesOfInterest(&NODE_TYPE_AVATAR_MIXER, 1); QNetworkAccessManager* manager = new QNetworkAccessManager(); @@ -29,10 +39,50 @@ void Agent::run(QUrl scriptURL) { QScriptEngine engine; - AvatarData *someObject = new AvatarData; + AvatarData *testAvatarData = new AvatarData; - QScriptValue objectValue = engine.newQObject(someObject); - engine.globalObject().setProperty("AvatarData", objectValue); + QScriptValue avatarDataValue = engine.newQObject(testAvatarData); + engine.globalObject().setProperty("AvatarData", avatarDataValue); + + QScriptValue agentValue = engine.newQObject(this); + engine.globalObject().setProperty("Agent", agentValue); + + qDebug() << "Downloaded script:" << scriptString; + + qDebug() << "Evaluated script:" << engine.evaluate(scriptString).toString(); + + timeval thisSend; + timeval lastDomainServerCheckIn = {}; + int numMicrosecondsSleep = 0; + + const float DATA_SEND_INTERVAL_MSECS = (1 / 60) * 1000; + + sockaddr_in senderAddress; + unsigned char receivedData[MAX_PACKET_SIZE]; + ssize_t receivedBytes; + + while (!_shouldStop) { + // update the thisSend timeval to the current time + gettimeofday(&thisSend, NULL); + + // send a check in packet to the domain server if DOMAIN_SERVER_CHECK_IN_USECS has elapsed + if (usecTimestampNow() - usecTimestamp(&lastDomainServerCheckIn) >= DOMAIN_SERVER_CHECK_IN_USECS) { + gettimeofday(&lastDomainServerCheckIn, NULL); + NodeList::getInstance()->sendDomainServerCheckIn(); + } + + emit preSendCallback(); + + testAvatarData->sendData(); + + if (NodeList::getInstance()->getNodeSocket()->receive((sockaddr*) &senderAddress, receivedData, &receivedBytes)) { + NodeList::getInstance()->processNodeData((sockaddr*) &senderAddress, receivedData, receivedBytes); + } + + // sleep for the correct amount of time to have data send be consistently timed + if ((numMicrosecondsSleep = (DATA_SEND_INTERVAL_MSECS * 1000) - (usecTimestampNow() - usecTimestamp(&thisSend))) > 0) { + usleep(numMicrosecondsSleep); + } + } - qDebug() << "Execution of script:" << engine.evaluate(scriptString).toString(); } \ No newline at end of file diff --git a/libraries/avatars/src/Agent.h b/libraries/avatars/src/Agent.h index d02ac67f94..e7e53467fa 100644 --- a/libraries/avatars/src/Agent.h +++ b/libraries/avatars/src/Agent.h @@ -16,14 +16,19 @@ #include "SharedUtil.h" +#include #include -class Agent { -public: - bool volatile shouldStop; +class Agent : public QObject { + Q_OBJECT +public: + Agent(); + + bool volatile _shouldStop; void run(QUrl scriptUrl); -private: +signals: + void preSendCallback(); }; #endif /* defined(__hifi__Operative__) */ diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 44393b66d5..b61d035ce3 100755 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -10,8 +10,9 @@ #include #include -#include +#include #include +#include #include "AvatarData.h" //#include @@ -50,6 +51,24 @@ AvatarData::~AvatarData() { delete _handData; } +void AvatarData::sendData() { + + // called from Agent visual loop to send data + if (Node* avatarMixer = NodeList::getInstance()->soloNodeOfType(NODE_TYPE_AVATAR_MIXER)) { + unsigned char packet[MAX_PACKET_SIZE]; + + unsigned char* endOfPacket = packet; + endOfPacket += populateTypeAndVersion(endOfPacket, PACKET_TYPE_HEAD_DATA); + endOfPacket += packNodeId(endOfPacket, NodeList::getInstance()->getOwnerID()); + + int numPacketBytes = (endOfPacket - packet) + getBroadcastData(endOfPacket); + + qDebug("The current body yaw is %f\n", _bodyYaw); + + NodeList::getInstance()->getNodeSocket()->send(avatarMixer->getActiveSocket(), packet, numPacketBytes); + } +} + int AvatarData::getBroadcastData(unsigned char* destinationBuffer) { unsigned char* bufferStart = destinationBuffer; diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 8c1dac5ad4..2399d1062c 100755 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -56,7 +56,6 @@ public: // Body Rotation float getBodyYaw() const { return _bodyYaw; } - void setBodyYaw(float bodyYaw) { _bodyYaw = bodyYaw; } float getBodyPitch() const { return _bodyPitch; } void setBodyPitch(float bodyPitch) { _bodyPitch = bodyPitch; } float getBodyRoll() const {return _bodyRoll; } @@ -108,6 +107,8 @@ public: public slots: void setPosition(float x, float y, float z) { _position = glm::vec3(x, y, z); } + void setBodyYaw(float bodyYaw) { _bodyYaw = bodyYaw; } + void sendData(); protected: glm::vec3 _position; diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp index 0b32843644..93471f7356 100644 --- a/libraries/shared/src/NodeList.cpp +++ b/libraries/shared/src/NodeList.cpp @@ -117,8 +117,10 @@ void NodeList::processNodeData(sockaddr* senderAddress, unsigned char* packetDat sockaddr_in domainServerSocket = *(sockaddr_in*) senderAddress; const char* domainSenderIP = inet_ntoa(domainServerSocket.sin_addr); + processDomainServerList(packetData, dataBytes); + if (memcmp(domainSenderIP, _domainIP, strlen(domainSenderIP)) == 0) { - processDomainServerList(packetData, dataBytes); + } break;