From 4ee416ba96cf7408b9d921f6a8cc99480362018a Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 19 Feb 2014 16:55:24 -0800 Subject: [PATCH 1/4] fixes for scripted avatars, closes #2033 --- assignment-client/src/Agent.cpp | 4 +++ assignment-client/src/Agent.h | 2 +- interface/src/Application.cpp | 2 +- interface/src/avatar/MyAvatar.cpp | 7 ---- interface/src/avatar/MyAvatar.h | 1 - libraries/avatars/src/AvatarData.cpp | 7 ++++ libraries/avatars/src/AvatarData.h | 5 +++ libraries/script-engine/src/ScriptEngine.cpp | 37 ++++++++++++++------ libraries/script-engine/src/ScriptEngine.h | 7 ++-- 9 files changed, 50 insertions(+), 22 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index cc0ddd59f2..015c3916ea 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -113,6 +113,10 @@ void Agent::run() { // setup an Avatar for the script to use AvatarData scriptedAvatar; + // call model URL setters with empty URLs so our avatar, if user, will have the default models + scriptedAvatar.setFaceModelURL(QUrl()); + scriptedAvatar.setSkeletonModelURL(QUrl()); + // give this AvatarData object to the script engine _scriptEngine.setAvatarData(&scriptedAvatar, "Avatar"); diff --git a/assignment-client/src/Agent.h b/assignment-client/src/Agent.h index bc6b4f65fe..1502093d5b 100644 --- a/assignment-client/src/Agent.h +++ b/assignment-client/src/Agent.h @@ -29,7 +29,7 @@ class Agent : public ThreadedAssignment { public: Agent(const QByteArray& packet); - void setIsAvatar(bool isAvatar) { _scriptEngine.setIsAvatar(isAvatar); } + void setIsAvatar(bool isAvatar) { QMetaObject::invokeMethod(&_scriptEngine, "setIsAvatar", Q_ARG(bool, isAvatar)); } bool isAvatar() const { return _scriptEngine.isAvatar(); } public slots: diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index ac45bf39d8..393cb39ec6 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -252,7 +252,7 @@ Application::Application(int& argc, char** argv, timeval &startup_time) : // send the identity packet for our avatar each second to our avatar mixer QTimer* identityPacketTimer = new QTimer(); connect(identityPacketTimer, &QTimer::timeout, _myAvatar, &MyAvatar::sendIdentityPacket); - identityPacketTimer->start(1000); + identityPacketTimer->start(AVATAR_IDENTITY_PACKET_SEND_INTERVAL_MSECS); QString cachePath = QStandardPaths::writableLocation(QStandardPaths::DataLocation); diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 016159f415..8e91fc8c45 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -648,13 +648,6 @@ void MyAvatar::sendKillAvatar() { NodeList::getInstance()->broadcastToNodes(killPacket, NodeSet() << NodeType::AvatarMixer); } -void MyAvatar::sendIdentityPacket() { - QByteArray identityPacket = byteArrayWithPopluatedHeader(PacketTypeAvatarIdentity); - identityPacket.append(AvatarData::identityByteArray()); - - NodeList::getInstance()->broadcastToNodes(identityPacket, NodeSet() << NodeType::AvatarMixer); -} - void MyAvatar::orbit(const glm::vec3& position, int deltaX, int deltaY) { // first orbit horizontally glm::quat orientation = getOrientation(); diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 1bc5de204b..538ca4e0b2 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -89,7 +89,6 @@ public slots: void increaseSize(); void decreaseSize(); void resetSize(); - void sendIdentityPacket(); // Set/Get update the thrust that will move the avatar around void addThrust(glm::vec3 newThrust) { _thrust += newThrust; }; diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 8e9eb430e8..e40adbc0df 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -338,3 +338,10 @@ void AvatarData::setOrientation(const glm::quat& orientation) { _bodyYaw = eulerAngles.y; _bodyRoll = eulerAngles.z; } + +void AvatarData::sendIdentityPacket() { + QByteArray identityPacket = byteArrayWithPopluatedHeader(PacketTypeAvatarIdentity); + identityPacket.append(identityByteArray()); + + NodeList::getInstance()->broadcastToNodes(identityPacket, NodeSet() << NodeType::AvatarMixer); +} \ No newline at end of file diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index a889b52bd0..6e95c1c29d 100755 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -52,6 +52,8 @@ static const float MIN_AVATAR_SCALE = .005f; const float MAX_AUDIO_LOUDNESS = 1000.0; // close enough for mouth animation +const int AVATAR_IDENTITY_PACKET_SEND_INTERVAL_MSECS = 1000; + const QUrl DEFAULT_HEAD_MODEL_URL = QUrl("http://public.highfidelity.io/meshes/defaultAvatar_head.fst"); const QUrl DEFAULT_BODY_MODEL_URL = QUrl("http://public.highfidelity.io/meshes/defaultAvatar_body.fst"); @@ -157,6 +159,9 @@ public: virtual float getBoundingRadius() const { return 1.f; } +public slots: + void sendIdentityPacket(); + protected: glm::vec3 _position; glm::vec3 _handPosition; diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 5c089b9a74..1efda7cfe3 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -44,6 +44,7 @@ ScriptEngine::ScriptEngine(const QString& scriptContents, bool wantMenuItems, co AbstractMenuInterface* menu, AbstractControllerScriptingInterface* controllerScriptingInterface) : _isAvatar(false), + _avatarIdentityTimer(NULL), _avatarData(NULL) { _scriptContents = scriptContents; @@ -74,6 +75,21 @@ ScriptEngine::~ScriptEngine() { //printf("ScriptEngine::~ScriptEngine()...\n"); } +void ScriptEngine::setIsAvatar(bool isAvatar) { + _isAvatar = isAvatar; + + if (_isAvatar && !_avatarIdentityTimer) { + // set up the avatar identity timer + _avatarIdentityTimer = new QTimer(this); + + // connect our slot + connect(_avatarIdentityTimer, &QTimer::timeout, this, &ScriptEngine::sendAvatarIdentityPacket); + + // start the timer + _avatarIdentityTimer->start(AVATAR_IDENTITY_PACKET_SEND_INTERVAL_MSECS); + } +} + void ScriptEngine::setAvatarData(AvatarData* avatarData, const QString& objectName) { _avatarData = avatarData; @@ -84,6 +100,7 @@ void ScriptEngine::setAvatarData(AvatarData* avatarData, const QString& objectNa registerGlobalObject(objectName, _avatarData); } + void ScriptEngine::setupMenuItems() { if (_menu && _wantMenuItems) { _menu->addActionToQMenuAndActionHash(_menu->getActiveScriptsMenu(), _scriptMenuName, 0, this, SLOT(stop())); @@ -173,6 +190,12 @@ void ScriptEngine::evaluate() { } } +void ScriptEngine::sendAvatarIdentityPacket() { + if (_isAvatar && _avatarData) { + _avatarData->sendIdentityPacket(); + } +} + void ScriptEngine::run() { if (!_isInitialized) { init(); @@ -229,16 +252,7 @@ void ScriptEngine::run() { } if (_isAvatar && _avatarData) { - static QByteArray avatarPacket; - int numAvatarHeaderBytes = 0; - - if (avatarPacket.size() == 0) { - // pack the avatar header bytes the first time - // unlike the _avatar.getBroadcastData these won't change - numAvatarHeaderBytes = populatePacketHeader(avatarPacket, PacketTypeAvatarData); - } - - avatarPacket.resize(numAvatarHeaderBytes); + QByteArray avatarPacket = byteArrayWithPopluatedHeader(PacketTypeAvatarData); avatarPacket.append(_avatarData->toByteArray()); nodeList->broadcastToNodes(avatarPacket, NodeSet() << NodeType::AvatarMixer); @@ -253,6 +267,9 @@ void ScriptEngine::run() { } emit scriptEnding(); + // kill the avatar identity timer + delete _avatarIdentityTimer; + if (_voxelsScriptingInterface.getVoxelPacketSender()->serversExist()) { // release the queue of edit voxel messages. _voxelsScriptingInterface.getVoxelPacketSender()->releaseQueuedMessages(); diff --git a/libraries/script-engine/src/ScriptEngine.h b/libraries/script-engine/src/ScriptEngine.h index 3de16348d4..cf5ad1a68b 100644 --- a/libraries/script-engine/src/ScriptEngine.h +++ b/libraries/script-engine/src/ScriptEngine.h @@ -11,9 +11,9 @@ #include -#include #include #include +#include #include #include @@ -52,7 +52,7 @@ public: void registerGlobalObject(const QString& name, QObject* object); /// registers a global object by name - void setIsAvatar(bool isAvatar) { _isAvatar = isAvatar; } + Q_INVOKABLE void setIsAvatar(bool isAvatar); bool isAvatar() const { return _isAvatar; } void setAvatarData(AvatarData* avatarData, const QString& objectName); @@ -84,9 +84,12 @@ protected: bool _isInitialized; QScriptEngine _engine; bool _isAvatar; + QTimer* _avatarIdentityTimer; QHash _timerFunctionMap; private: + void sendAvatarIdentityPacket(); + QObject* setupTimerWithInterval(const QScriptValue& function, int intervalMS, bool isSingleShot); void stopTimer(QTimer* timer); From ee9f8937e3082ec28806768ed07b2ca313e82f3e Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 19 Feb 2014 18:03:34 -0800 Subject: [PATCH 2/4] fix a silly typo --- assignment-client/src/avatars/AvatarMixer.cpp | 6 +++--- data-server/src/DataServer.cpp | 4 ++-- domain-server/src/DomainServer.cpp | 4 ++-- interface/src/Application.cpp | 2 +- interface/src/MetavoxelSystem.cpp | 2 +- interface/src/avatar/AvatarManager.cpp | 2 +- interface/src/avatar/MyAvatar.cpp | 2 +- libraries/audio/src/AudioInjector.cpp | 2 +- libraries/avatars/src/AvatarData.cpp | 2 +- libraries/script-engine/src/ScriptEngine.cpp | 2 +- libraries/shared/src/DataServerClient.cpp | 4 ++-- libraries/shared/src/NodeList.cpp | 8 ++++---- libraries/shared/src/PacketHeaders.cpp | 2 +- libraries/shared/src/PacketHeaders.h | 2 +- 14 files changed, 22 insertions(+), 22 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index c7989bc9e9..63bdccbab7 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -93,7 +93,7 @@ void broadcastIdentityPacket() { NodeList* nodeList = NodeList::getInstance(); - QByteArray avatarIdentityPacket = byteArrayWithPopluatedHeader(PacketTypeAvatarIdentity); + QByteArray avatarIdentityPacket = byteArrayWithPopulatedHeader(PacketTypeAvatarIdentity); int numPacketHeaderBytes = avatarIdentityPacket.size(); foreach (const SharedNodePointer& node, nodeList->getNodeHash()) { @@ -128,7 +128,7 @@ void AvatarMixer::nodeKilled(SharedNodePointer killedNode) { && killedNode->getLinkedData()) { // this was an avatar we were sending to other people // send a kill packet for it to our other nodes - QByteArray killPacket = byteArrayWithPopluatedHeader(PacketTypeKillAvatar); + QByteArray killPacket = byteArrayWithPopulatedHeader(PacketTypeKillAvatar); killPacket += killedNode->getUUID().toRfc4122(); NodeList::getInstance()->broadcastToNodes(killPacket, @@ -159,7 +159,7 @@ void AvatarMixer::readPendingDatagrams() { if (nodeData->hasIdentityChangedAfterParsing(receivedPacket) && !nodeData->hasSentIdentityBetweenKeyFrames()) { // this avatar changed their identity in some way and we haven't sent a packet in this keyframe - QByteArray identityPacket = byteArrayWithPopluatedHeader(PacketTypeAvatarIdentity); + QByteArray identityPacket = byteArrayWithPopulatedHeader(PacketTypeAvatarIdentity); QByteArray individualByteArray = nodeData->identityByteArray(); individualByteArray.replace(0, NUM_BYTES_RFC4122_UUID, avatarNode->getUUID().toRfc4122()); diff --git a/data-server/src/DataServer.cpp b/data-server/src/DataServer.cpp index 97228b67a3..76386d7b5a 100644 --- a/data-server/src/DataServer.cpp +++ b/data-server/src/DataServer.cpp @@ -121,7 +121,7 @@ void DataServer::readPendingDatagrams() { if (reply->type == REDIS_REPLY_STATUS && strcmp("OK", reply->str) == 0) { // if redis stored the value successfully reply back with a confirm // which is a reply packet with the sequence number - QByteArray replyPacket = byteArrayWithPopluatedHeader(PacketTypeDataServerConfirm, _uuid); + QByteArray replyPacket = byteArrayWithPopulatedHeader(PacketTypeDataServerConfirm, _uuid); replyPacket.append(sequenceNumber); @@ -132,7 +132,7 @@ void DataServer::readPendingDatagrams() { } else { // setup a send packet with the returned data // leverage the packetData sent by overwriting and appending - QByteArray sendPacket = byteArrayWithPopluatedHeader(PacketTypeDataServerSend, _uuid); + QByteArray sendPacket = byteArrayWithPopulatedHeader(PacketTypeDataServerSend, _uuid); QDataStream sendPacketStream(&sendPacket, QIODevice::Append); sendPacketStream << sequenceNumber; diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 896b709e2a..e9816abe4c 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -221,10 +221,10 @@ void DomainServer::readAvailableDatagrams() { HifiSockAddr senderSockAddr, nodePublicAddress, nodeLocalAddress; - static QByteArray broadcastPacket = byteArrayWithPopluatedHeader(PacketTypeDomainList); + static QByteArray broadcastPacket = byteArrayWithPopulatedHeader(PacketTypeDomainList); static int numBroadcastPacketHeaderBytes = broadcastPacket.size(); - static QByteArray assignmentPacket = byteArrayWithPopluatedHeader(PacketTypeCreateAssignment); + static QByteArray assignmentPacket = byteArrayWithPopulatedHeader(PacketTypeCreateAssignment); static int numAssignmentPacketHeaderBytes = assignmentPacket.size(); QByteArray receivedPacket; diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 393cb39ec6..73d13750bb 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2376,7 +2376,7 @@ void Application::updateMyAvatar(float deltaTime) { _myAvatar->update(deltaTime); // send head/hand data to the avatar mixer and voxel server - QByteArray packet = byteArrayWithPopluatedHeader(PacketTypeAvatarData); + QByteArray packet = byteArrayWithPopulatedHeader(PacketTypeAvatarData); packet.append(_myAvatar->toByteArray()); controlledBroadcastToNodes(packet, NodeSet() << NodeType::AvatarMixer); diff --git a/interface/src/MetavoxelSystem.cpp b/interface/src/MetavoxelSystem.cpp index 34c3be5308..3ed62cdb14 100644 --- a/interface/src/MetavoxelSystem.cpp +++ b/interface/src/MetavoxelSystem.cpp @@ -180,7 +180,7 @@ bool MetavoxelSystem::PointVisitor::visit(MetavoxelInfo& info) { } static QByteArray createDatagramHeader(const QUuid& sessionID) { - QByteArray header = byteArrayWithPopluatedHeader(PacketTypeMetavoxelData); + QByteArray header = byteArrayWithPopulatedHeader(PacketTypeMetavoxelData); header += sessionID.toRfc4122(); return header; } diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 4cc568cf18..b873b10017 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -144,7 +144,7 @@ void AvatarManager::processAvatarMixerDatagram(const QByteArray& datagram, const void AvatarManager::processAvatarDataPacket(const QByteArray &datagram, const QWeakPointer &mixerWeakPointer) { int bytesRead = numBytesForPacketHeader(datagram); - QByteArray dummyAvatarByteArray = byteArrayWithPopluatedHeader(PacketTypeAvatarData); + QByteArray dummyAvatarByteArray = byteArrayWithPopulatedHeader(PacketTypeAvatarData); int numDummyHeaderBytes = dummyAvatarByteArray.size(); int numDummyHeaderBytesWithoutUUID = numDummyHeaderBytes - NUM_BYTES_RFC4122_UUID; diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 8e91fc8c45..90ef18848b 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -644,7 +644,7 @@ void MyAvatar::loadData(QSettings* settings) { } void MyAvatar::sendKillAvatar() { - QByteArray killPacket = byteArrayWithPopluatedHeader(PacketTypeKillAvatar); + QByteArray killPacket = byteArrayWithPopulatedHeader(PacketTypeKillAvatar); NodeList::getInstance()->broadcastToNodes(killPacket, NodeSet() << NodeType::AvatarMixer); } diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index ff243459b7..2d4074f125 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -47,7 +47,7 @@ void AudioInjector::injectAudio() { NodeList* nodeList = NodeList::getInstance(); // setup the packet for injected audio - QByteArray injectAudioPacket = byteArrayWithPopluatedHeader(PacketTypeInjectAudio); + QByteArray injectAudioPacket = byteArrayWithPopulatedHeader(PacketTypeInjectAudio); QDataStream packetStream(&injectAudioPacket, QIODevice::Append); packetStream << QUuid::createUuid(); diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index e40adbc0df..296b91ce2f 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -340,7 +340,7 @@ void AvatarData::setOrientation(const glm::quat& orientation) { } void AvatarData::sendIdentityPacket() { - QByteArray identityPacket = byteArrayWithPopluatedHeader(PacketTypeAvatarIdentity); + QByteArray identityPacket = byteArrayWithPopulatedHeader(PacketTypeAvatarIdentity); identityPacket.append(identityByteArray()); NodeList::getInstance()->broadcastToNodes(identityPacket, NodeSet() << NodeType::AvatarMixer); diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 1efda7cfe3..076f941222 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -252,7 +252,7 @@ void ScriptEngine::run() { } if (_isAvatar && _avatarData) { - QByteArray avatarPacket = byteArrayWithPopluatedHeader(PacketTypeAvatarData); + QByteArray avatarPacket = byteArrayWithPopulatedHeader(PacketTypeAvatarData); avatarPacket.append(_avatarData->toByteArray()); nodeList->broadcastToNodes(avatarPacket, NodeSet() << NodeType::AvatarMixer); diff --git a/libraries/shared/src/DataServerClient.cpp b/libraries/shared/src/DataServerClient.cpp index fd003aa3bb..8903aa0524 100644 --- a/libraries/shared/src/DataServerClient.cpp +++ b/libraries/shared/src/DataServerClient.cpp @@ -31,7 +31,7 @@ const HifiSockAddr& DataServerClient::dataServerSockAddr() { void DataServerClient::putValueForKeyAndUserString(const QString& key, const QString& value, const QString& userString) { // setup the header for this packet and push packetStream to desired spot - QByteArray putPacket = byteArrayWithPopluatedHeader(PacketTypeDataServerPut); + QByteArray putPacket = byteArrayWithPopulatedHeader(PacketTypeDataServerPut); QDataStream packetStream(&putPacket, QIODevice::Append); // pack our data for the put packet @@ -66,7 +66,7 @@ void DataServerClient::getValuesForKeysAndUUID(const QStringList& keys, const QU void DataServerClient::getValuesForKeysAndUserString(const QStringList& keys, const QString& userString, DataServerCallbackObject* callbackObject) { if (!userString.isEmpty() && keys.size() <= UCHAR_MAX) { - QByteArray getPacket = byteArrayWithPopluatedHeader(PacketTypeDataServerGet); + QByteArray getPacket = byteArrayWithPopulatedHeader(PacketTypeDataServerGet); QDataStream packetStream(&getPacket, QIODevice::Append); // pack our data for the getPacket diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp index 8dd3857198..bd43c5d2d9 100644 --- a/libraries/shared/src/NodeList.cpp +++ b/libraries/shared/src/NodeList.cpp @@ -528,7 +528,7 @@ void NodeList::sendDomainServerCheckIn() { // construct the DS check in packet if we can // check in packet has header, optional UUID, node type, port, IP, node types of interest, null termination - QByteArray domainServerPacket = byteArrayWithPopluatedHeader(PacketTypeDomainListRequest); + QByteArray domainServerPacket = byteArrayWithPopulatedHeader(PacketTypeDomainListRequest); QDataStream packetStream(&domainServerPacket, QIODevice::Append); // pack our data to send to the domain-server @@ -616,7 +616,7 @@ void NodeList::sendAssignment(Assignment& assignment) { ? PacketTypeCreateAssignment : PacketTypeRequestAssignment; - QByteArray packet = byteArrayWithPopluatedHeader(assignmentPacketType); + QByteArray packet = byteArrayWithPopulatedHeader(assignmentPacketType); QDataStream packetStream(&packet, QIODevice::Append); packetStream << assignment; @@ -631,7 +631,7 @@ void NodeList::sendAssignment(Assignment& assignment) { } QByteArray NodeList::constructPingPacket(PingType_t pingType) { - QByteArray pingPacket = byteArrayWithPopluatedHeader(PacketTypePing); + QByteArray pingPacket = byteArrayWithPopulatedHeader(PacketTypePing); QDataStream packetStream(&pingPacket, QIODevice::Append); @@ -651,7 +651,7 @@ QByteArray NodeList::constructPingReplyPacket(const QByteArray& pingPacket) { quint64 timeFromOriginalPing; pingPacketStream >> timeFromOriginalPing; - QByteArray replyPacket = byteArrayWithPopluatedHeader(PacketTypePingReply); + QByteArray replyPacket = byteArrayWithPopulatedHeader(PacketTypePingReply); QDataStream packetStream(&replyPacket, QIODevice::Append); packetStream << typeFromOriginalPing << timeFromOriginalPing << usecTimestampNow(); diff --git a/libraries/shared/src/PacketHeaders.cpp b/libraries/shared/src/PacketHeaders.cpp index b1f6ef1730..69178d7bd5 100644 --- a/libraries/shared/src/PacketHeaders.cpp +++ b/libraries/shared/src/PacketHeaders.cpp @@ -65,7 +65,7 @@ PacketVersion versionForPacketType(PacketType type) { } } -QByteArray byteArrayWithPopluatedHeader(PacketType type, const QUuid& connectionUUID) { +QByteArray byteArrayWithPopulatedHeader(PacketType type, const QUuid& connectionUUID) { QByteArray freshByteArray(MAX_PACKET_HEADER_BYTES, 0); freshByteArray.resize(populatePacketHeader(freshByteArray, type, connectionUUID)); return freshByteArray; diff --git a/libraries/shared/src/PacketHeaders.h b/libraries/shared/src/PacketHeaders.h index c1a5a34114..c7496b7f4a 100644 --- a/libraries/shared/src/PacketHeaders.h +++ b/libraries/shared/src/PacketHeaders.h @@ -66,7 +66,7 @@ PacketVersion versionForPacketType(PacketType type); const QUuid nullUUID = QUuid(); -QByteArray byteArrayWithPopluatedHeader(PacketType type, const QUuid& connectionUUID = nullUUID); +QByteArray byteArrayWithPopulatedHeader(PacketType type, const QUuid& connectionUUID = nullUUID); int populatePacketHeader(QByteArray& packet, PacketType type, const QUuid& connectionUUID = nullUUID); int populatePacketHeader(char* packet, PacketType type, const QUuid& connectionUUID = nullUUID); From 4fbe8acd1e2476e9d612b5a567d6171f0e44d365 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 20 Feb 2014 11:12:53 -0800 Subject: [PATCH 3/4] fix face and skeleton model URL Q_PROPERTY macros --- libraries/avatars/src/AvatarData.cpp | 1 - libraries/avatars/src/AvatarData.h | 11 +++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 296b91ce2f..8566958349 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -323,7 +323,6 @@ void AvatarData::setDisplayName(const QString& displayName) { qDebug() << "Changing display name for avatar to" << displayName; } - void AvatarData::setClampedTargetScale(float targetScale) { targetScale = glm::clamp(targetScale, MIN_AVATAR_SCALE, MAX_AVATAR_SCALE); diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 6e95c1c29d..ad95d021ce 100755 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -82,8 +82,8 @@ class AvatarData : public NodeData { Q_PROPERTY(float audioLoudness READ getAudioLoudness WRITE setAudioLoudness) Q_PROPERTY(float audioAverageLoudness READ getAudioAverageLoudness WRITE setAudioAverageLoudness) - Q_PROPERTY(QUrl faceModelURL READ getFaceModelURL WRITE setFaceModelURL) - Q_PROPERTY(QUrl skeletonModelURL READ getSkeletonModelURL WRITE setSkeletonModelURL) + Q_PROPERTY(QString faceModelURL READ getFaceModelURLFromScript WRITE setFaceModelURLFromScript) + Q_PROPERTY(QString skeletonModelURL READ getSkeletonModelURLFromScript WRITE setSkeletonModelURLFromScript) public: AvatarData(); ~AvatarData(); @@ -151,12 +151,19 @@ public: QByteArray identityByteArray(); const QUrl& getFaceModelURL() const { return _faceModelURL; } + QString getFaceModelURLString() const { return _faceModelURL.toString(); } const QUrl& getSkeletonModelURL() const { return _skeletonModelURL; } const QString& getDisplayName() const { return _displayName; } virtual void setFaceModelURL(const QUrl& faceModelURL); virtual void setSkeletonModelURL(const QUrl& skeletonModelURL); virtual void setDisplayName(const QString& displayName); + QString getFaceModelURLFromScript() const { return _faceModelURL.toString(); } + void setFaceModelURLFromScript(const QString& faceModelString) { setFaceModelURL(faceModelString); } + + QString getSkeletonModelURLFromScript() const { return _skeletonModelURL.toString(); } + void setSkeletonModelURLFromScript(const QString& skeletonModelString) { setSkeletonModelURL(QUrl(skeletonModelString)); } + virtual float getBoundingRadius() const { return 1.f; } public slots: From 2626d7db8c1709419f2f5ca3e97361fbf93ac110 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 20 Feb 2014 11:14:50 -0800 Subject: [PATCH 4/4] add a bot example script --- examples/bot.js | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 examples/bot.js diff --git a/examples/bot.js b/examples/bot.js new file mode 100644 index 0000000000..6d0abd740e --- /dev/null +++ b/examples/bot.js @@ -0,0 +1,34 @@ +// +// bot.js +// hifi +// +// Created by Brad Hefta-Gaub on 2/20/14. +// Copyright (c) 2014 HighFidelity, Inc. All rights reserved. +// +// This is an example script that demonstrates an NPC avatar. +// +// + +function getRandomFloat(min, max) { + return Math.random() * (max - min) + min; +} + +function getRandomInt (min, max) { + return Math.floor(Math.random() * (max - min + 1)) + min; +} + +// choose a random x and y in the range of 0 to 50 +positionX = getRandomFloat(0, 50); +positionZ = getRandomFloat(0, 50); + +// change the avatar's position to the random one +Avatar.position = {x: positionX, y: 0, z: positionZ}; + +// pick an integer between 1 and 20 for the face model for this bot +botNumber = getRandomInt(1, 20); + +// set the face model fst using the bot number +// there is no need to change the body model - we're using the default +Avatar.faceModelURL = "https://s3-us-west-1.amazonaws.com/highfidelity-public/meshes/bot" + botNumber + ".fst"; + +Agent.isAvatar = true; \ No newline at end of file