This commit is contained in:
Philip Rosedale 2014-01-22 16:35:01 -08:00
commit bacfa15065
37 changed files with 146 additions and 324 deletions

View file

@ -97,9 +97,6 @@ void Agent::run() {
// setup an Avatar for the script to use // setup an Avatar for the script to use
AvatarData scriptedAvatar; AvatarData scriptedAvatar;
// match the scripted avatar's UUID to the DataServerScriptingInterface UUID
scriptedAvatar.setUUID(_scriptEngine.getDataServerScriptingInterface().getUUID());
// give this AvatarData object to the script engine // give this AvatarData object to the script engine
_scriptEngine.setAvatarData(&scriptedAvatar, "Avatar"); _scriptEngine.setAvatarData(&scriptedAvatar, "Avatar");

View file

@ -71,7 +71,6 @@ foreach(EXTERNAL_SOURCE_SUBDIR ${EXTERNAL_SOURCE_SUBDIRS})
set(INTERFACE_SRCS ${INTERFACE_SRCS} ${SUBDIR_SRCS}) set(INTERFACE_SRCS ${INTERFACE_SRCS} ${SUBDIR_SRCS})
endforeach(EXTERNAL_SOURCE_SUBDIR) endforeach(EXTERNAL_SOURCE_SUBDIR)
find_package(Qt5Core REQUIRED) find_package(Qt5Core REQUIRED)
find_package(Qt5Gui REQUIRED) find_package(Qt5Gui REQUIRED)
find_package(Qt5Multimedia REQUIRED) find_package(Qt5Multimedia REQUIRED)
@ -81,7 +80,14 @@ find_package(Qt5Svg REQUIRED)
find_package(Qt5WebKit REQUIRED) find_package(Qt5WebKit REQUIRED)
find_package(Qt5WebKitWidgets REQUIRED) find_package(Qt5WebKitWidgets REQUIRED)
find_package(Qt5Xml REQUIRED) find_package(Qt5Xml REQUIRED)
find_package(Qt5UiTools REQUIRED)
# grab the ui files in resources/ui
file (GLOB_RECURSE QT_UI_FILES ui/*.ui)
# have qt5 wrap them and generate the appropriate header files
qt5_wrap_ui(QT_UI_HEADERS ${QT_UI_FILES})
# add them to the interface source files
set(INTERFACE_SRCS ${INTERFACE_SRCS} ${QT_UI_HEADERS})
if (APPLE) if (APPLE)
set(MACOSX_BUNDLE_BUNDLE_NAME Interface) set(MACOSX_BUNDLE_BUNDLE_NAME Interface)

View file

@ -2438,17 +2438,14 @@ void Application::updateAvatar(float deltaTime) {
// Get audio loudness data from audio input device // Get audio loudness data from audio input device
_myAvatar.getHead().setAudioLoudness(_audio.getLastInputLoudness()); _myAvatar.getHead().setAudioLoudness(_audio.getLastInputLoudness());
NodeList* nodeList = NodeList::getInstance();
// send head/hand data to the avatar mixer and voxel server // send head/hand data to the avatar mixer and voxel server
unsigned char broadcastString[MAX_PACKET_SIZE]; unsigned char broadcastString[MAX_PACKET_SIZE];
unsigned char* endOfBroadcastStringWrite = broadcastString; unsigned char* endOfBroadcastStringWrite = broadcastString;
endOfBroadcastStringWrite += populateTypeAndVersion(endOfBroadcastStringWrite, PACKET_TYPE_HEAD_DATA); endOfBroadcastStringWrite += populateTypeAndVersion(endOfBroadcastStringWrite, PACKET_TYPE_HEAD_DATA);
QByteArray ownerUUID = nodeList->getOwnerUUID().toRfc4122(); // pack the NodeList owner UUID
memcpy(endOfBroadcastStringWrite, ownerUUID.constData(), ownerUUID.size()); endOfBroadcastStringWrite += NodeList::getInstance()->packOwnerUUID(endOfBroadcastStringWrite);
endOfBroadcastStringWrite += ownerUUID.size();
endOfBroadcastStringWrite += _myAvatar.getBroadcastData(endOfBroadcastStringWrite); endOfBroadcastStringWrite += _myAvatar.getBroadcastData(endOfBroadcastStringWrite);
@ -3857,6 +3854,11 @@ void Application::setMenuShortcutsEnabled(bool enabled) {
void Application::attachNewHeadToNode(Node* newNode) { void Application::attachNewHeadToNode(Node* newNode) {
if (newNode->getLinkedData() == NULL) { if (newNode->getLinkedData() == NULL) {
newNode->setLinkedData(new Avatar(newNode)); newNode->setLinkedData(new Avatar(newNode));
// new UUID requires mesh and skeleton request to data-server
DataServerClient::getValuesForKeysAndUUID(QStringList() << DataServerKey::FaceMeshURL << DataServerKey::SkeletonURL,
newNode->getUUID(), Application::getInstance()->getProfile());
} }
} }

View file

@ -15,7 +15,7 @@
#include "VoxelSystem.h" #include "VoxelSystem.h"
/// Generalized threaded processor for handling received inbound packets. /// Generalized threaded processor for handling received inbound packets.
class VoxelHideShowThread : public virtual GenericThread { class VoxelHideShowThread : public GenericThread {
public: public:
VoxelHideShowThread(VoxelSystem* theSystem); VoxelHideShowThread(VoxelSystem* theSystem);

View file

@ -345,20 +345,11 @@ int Avatar::parseData(unsigned char* sourceBuffer, int numBytes) {
// change in position implies movement // change in position implies movement
glm::vec3 oldPosition = _position; glm::vec3 oldPosition = _position;
// change in UUID requires mesh and skeleton request to data-server
QUuid oldUuid = _uuid;
int bytesRead = AvatarData::parseData(sourceBuffer, numBytes); int bytesRead = AvatarData::parseData(sourceBuffer, numBytes);
const float MOVE_DISTANCE_THRESHOLD = 0.001f; const float MOVE_DISTANCE_THRESHOLD = 0.001f;
_moving = glm::distance(oldPosition, _position) > MOVE_DISTANCE_THRESHOLD; _moving = glm::distance(oldPosition, _position) > MOVE_DISTANCE_THRESHOLD;
if (oldUuid != _uuid && !_uuid.isNull()) {
DataServerClient::getValuesForKeysAndUUID(QStringList() << DataServerKey::FaceMeshURL << DataServerKey::SkeletonURL,
_uuid, Application::getInstance()->getProfile());
}
return bytesRead; return bytesRead;
} }

View file

@ -48,8 +48,8 @@ QString Profile::getUserString() const {
void Profile::setUUID(const QUuid& uuid) { void Profile::setUUID(const QUuid& uuid) {
_uuid = uuid; _uuid = uuid;
// when the UUID is changed we need set it appropriately on our avatar instance // when the UUID is changed we need set it appropriately on the NodeList instance
Application::getInstance()->getAvatar()->setUUID(_uuid); NodeList::getInstance()->setOwnerUUID(uuid);
} }
void Profile::setFaceModelURL(const QUrl& faceModelURL) { void Profile::setFaceModelURL(const QUrl& faceModelURL) {
@ -156,19 +156,15 @@ void Profile::processDataServerResponse(const QString& userString, const QString
Application::getInstance()->getProfile()->setFaceModelURL(QUrl(valueList[i])); Application::getInstance()->getProfile()->setFaceModelURL(QUrl(valueList[i]));
} else { } else {
// mesh URL for a UUID, find avatar in our list // mesh URL for a UUID, find avatar in our list
SharedNodePointer matchingNode = NodeList::getInstance()->nodeWithUUID(QUuid(userString));
foreach (const SharedNodePointer& node, NodeList::getInstance()->getNodeHash()) { if (matchingNode && matchingNode->getType() == NODE_TYPE_AGENT) {
if (node->getLinkedData() != NULL && node->getType() == NODE_TYPE_AGENT) { qDebug() << "Changing mesh to" << valueList[i] << "for avatar with UUID"
Avatar* avatar = (Avatar *) node->getLinkedData(); << uuidStringWithoutCurlyBraces(matchingNode->getUUID());
if (avatar->getUUID() == QUuid(userString)) { Avatar* avatar = (Avatar *) matchingNode->getLinkedData();
qDebug() << "Changing mesh to" << valueList[i] << "for avatar with UUID"
<< uuidStringWithoutCurlyBraces(avatar->getUUID()); QMetaObject::invokeMethod(&avatar->getHead().getFaceModel(),
"setURL", Q_ARG(QUrl, QUrl(valueList[i])));
QMetaObject::invokeMethod(&avatar->getHead().getFaceModel(),
"setURL", Q_ARG(QUrl, QUrl(valueList[i])));
}
}
} }
} }
} else if (keyList[i] == DataServerKey::SkeletonURL) { } else if (keyList[i] == DataServerKey::SkeletonURL) {
@ -177,18 +173,15 @@ void Profile::processDataServerResponse(const QString& userString, const QString
Application::getInstance()->getProfile()->setSkeletonModelURL(QUrl(valueList[i])); Application::getInstance()->getProfile()->setSkeletonModelURL(QUrl(valueList[i]));
} else { } else {
// skeleton URL for a UUID, find avatar in our list // skeleton URL for a UUID, find avatar in our list
foreach (const SharedNodePointer& node, NodeList::getInstance()->getNodeHash()) { SharedNodePointer matchingNode = NodeList::getInstance()->nodeWithUUID(QUuid(userString));
if (node->getLinkedData() != NULL && node->getType() == NODE_TYPE_AGENT) { if (matchingNode && matchingNode->getType() == NODE_TYPE_AGENT) {
Avatar* avatar = (Avatar *) node->getLinkedData(); qDebug() << "Changing skeleton to" << valueList[i] << "for avatar with UUID"
<< uuidStringWithoutCurlyBraces(matchingNode->getUUID());
if (avatar->getUUID() == QUuid(userString)) {
qDebug() << "Changing skeleton to" << valueList[i] << "for avatar with UUID" Avatar* avatar = (Avatar *) matchingNode->getLinkedData();
<< uuidStringWithoutCurlyBraces(avatar->getUUID());
QMetaObject::invokeMethod(&avatar->getSkeletonModel(),
QMetaObject::invokeMethod(&avatar->getSkeletonModel(), "setURL", "setURL", Q_ARG(QUrl, QUrl(valueList[i])));
Q_ARG(QUrl, QUrl(valueList[i])));
}
}
} }
} }
} else if (keyList[i] == DataServerKey::Domain && keyList[i + 1] == DataServerKey::Position && } else if (keyList[i] == DataServerKey::Domain && keyList[i + 1] == DataServerKey::Position &&

View file

@ -97,7 +97,7 @@ void LogDialog::initControls() {
} }
void LogDialog::showEvent(QShowEvent*) { void LogDialog::showEvent(QShowEvent*) {
connect(_logger, SIGNAL(logReceived(QString)), this, SLOT(appendLogLine(QString))); connect(_logger, SIGNAL(logReceived(QString)), this, SLOT(appendLogLine(QString)), Qt::QueuedConnection);
showLogData(); showLogData();
} }
@ -111,11 +111,9 @@ void LogDialog::resizeEvent(QResizeEvent*) {
void LogDialog::appendLogLine(QString logLine) { void LogDialog::appendLogLine(QString logLine) {
if (isVisible()) { if (isVisible()) {
_mutex.lock();
if (logLine.contains(_searchTerm, Qt::CaseInsensitive)) { if (logLine.contains(_searchTerm, Qt::CaseInsensitive)) {
_logTextBox->appendPlainText(logLine.simplified()); _logTextBox->appendPlainText(logLine.simplified());
} }
_mutex.unlock();
_logTextBox->ensureCursorVisible(); _logTextBox->ensureCursorVisible();
} }
} }
@ -140,12 +138,10 @@ void LogDialog::handleSearchTextChanged(const QString searchText) {
void LogDialog::showLogData() { void LogDialog::showLogData() {
_logTextBox->clear(); _logTextBox->clear();
_mutex.lock();
QStringList _logData = _logger->getLogData(); QStringList _logData = _logger->getLogData();
for (int i = 0; i < _logData.size(); ++i) { for (int i = 0; i < _logData.size(); ++i) {
appendLogLine(_logData[i]); appendLogLine(_logData[i]);
} }
_mutex.unlock();
} }
KeywordHighlighter::KeywordHighlighter(QTextDocument *parent) : QSyntaxHighlighter(parent), keywordFormat() { KeywordHighlighter::KeywordHighlighter(QTextDocument *parent) : QSyntaxHighlighter(parent), keywordFormat() {

View file

@ -60,7 +60,6 @@ private:
QCheckBox* _extraDebuggingBox; QCheckBox* _extraDebuggingBox;
QPushButton* _revealLogButton; QPushButton* _revealLogButton;
QPlainTextEdit* _logTextBox; QPlainTextEdit* _logTextBox;
QMutex _mutex;
QString _searchTerm; QString _searchTerm;
KeywordHighlighter* _highlighter; KeywordHighlighter* _highlighter;

View file

@ -6,48 +6,40 @@
// Copyright (c) 2013, 2014 High Fidelity, Inc. All rights reserved. // Copyright (c) 2013, 2014 High Fidelity, Inc. All rights reserved.
// //
#include <QApplication>
#include <QDesktopWidget>
#include <QTextBlock>
#include <QtGui> #include <QtGui>
#include <QtUiTools>
#include <QPushButton>
#include <QLabel>
#include <QFrame>
#include "Application.h" #include "Application.h"
#include "SharedUtil.h" #include "ui_updateDialog.h"
#include "UpdateDialog.h" #include "UpdateDialog.h"
UpdateDialog::UpdateDialog(QWidget *parent, const QString& releaseNotes, const QString& latestVersion, const QUrl& downloadURL) : UpdateDialog::UpdateDialog(QWidget *parent, const QString& releaseNotes, const QString& latestVersion, const QUrl& downloadURL) :
QWidget(parent, Qt::Widget), QDialog(parent),
_latestVersion(latestVersion), _latestVersion(latestVersion),
_downloadUrl(downloadURL) { _downloadUrl(downloadURL)
{
QUiLoader updateDialogLoader; Ui::Dialog dialogUI;
QWidget* updateDialog; dialogUI.setupUi(this);
QFile updateDialogUi("resources/ui/updateDialog.ui");
updateDialogUi.open(QFile::ReadOnly);
updateDialog = updateDialogLoader.load(&updateDialogUi, this);
QString updateRequired = QString("You are currently running build %1, the latest build released is %2. \ QString updateRequired = QString("You are currently running build %1, the latest build released is %2. \
Please download and install the most recent release to access the latest features and bug fixes.") Please download and install the most recent release to access the latest features and bug fixes.")
.arg(Application::getInstance()->applicationVersion(), latestVersion); .arg(Application::getInstance()->applicationVersion(), latestVersion);
setAttribute(Qt::WA_DeleteOnClose);
updateDialog->setAttribute(Qt::WA_DeleteOnClose); QPushButton* downloadButton = findChild<QPushButton*>("downloadButton");
QPushButton* skipButton = findChild<QPushButton*>("skipButton");
QPushButton* downloadButton = updateDialog->findChild<QPushButton*>("downloadButton"); QPushButton* closeButton = findChild<QPushButton*>("closeButton");
QPushButton* skipButton = updateDialog->findChild<QPushButton*>("skipButton"); QLabel* updateContent = findChild<QLabel*>("updateContent");
QPushButton* closeButton = updateDialog->findChild<QPushButton*>("closeButton");
QLabel* updateContent = updateDialog->findChild<QLabel*>("updateContent");
updateContent->setText(updateRequired); updateContent->setText(updateRequired);
connect(downloadButton, SIGNAL(released()), this, SLOT(handleDownload())); connect(downloadButton, SIGNAL(released()), this, SLOT(handleDownload()));
connect(skipButton, SIGNAL(released()), this, SLOT(handleSkip())); connect(skipButton, SIGNAL(released()), this, SLOT(handleSkip()));
connect(closeButton, SIGNAL(released()), this, SLOT(close())); connect(closeButton, SIGNAL(released()), this, SLOT(close()));
updateDialog->show();
QMetaObject::invokeMethod(this, "show", Qt::QueuedConnection);
} }
void UpdateDialog::handleDownload() { void UpdateDialog::handleDownload() {

View file

@ -11,7 +11,7 @@
#include <QWidget> #include <QWidget>
class UpdateDialog : public QWidget { class UpdateDialog : public QDialog {
Q_OBJECT Q_OBJECT
public: public:

View file

@ -24,7 +24,6 @@ static const float fingerVectorRadix = 4; // bits of precision when converting f
AvatarData::AvatarData(Node* owningNode) : AvatarData::AvatarData(Node* owningNode) :
NodeData(owningNode), NodeData(owningNode),
_uuid(),
_handPosition(0,0,0), _handPosition(0,0,0),
_bodyYaw(-90.0), _bodyYaw(-90.0),
_bodyPitch(0.0), _bodyPitch(0.0),
@ -69,11 +68,6 @@ int AvatarData::getBroadcastData(unsigned char* destinationBuffer) {
_handData = new HandData(this); _handData = new HandData(this);
} }
// UUID
QByteArray uuidByteArray = _uuid.toRfc4122();
memcpy(destinationBuffer, uuidByteArray.constData(), uuidByteArray.size());
destinationBuffer += uuidByteArray.size();
// Body world position // Body world position
memcpy(destinationBuffer, &_position, sizeof(float) * 3); memcpy(destinationBuffer, &_position, sizeof(float) * 3);
destinationBuffer += sizeof(float) * 3; destinationBuffer += sizeof(float) * 3;
@ -180,11 +174,7 @@ int AvatarData::parseData(unsigned char* sourceBuffer, int numBytes) {
// push past the node session UUID // push past the node session UUID
sourceBuffer += NUM_BYTES_RFC4122_UUID; sourceBuffer += NUM_BYTES_RFC4122_UUID;
// user UUID
_uuid = QUuid::fromRfc4122(QByteArray((char*) sourceBuffer, NUM_BYTES_RFC4122_UUID));
sourceBuffer += NUM_BYTES_RFC4122_UUID;
// Body world position // Body world position
memcpy(&_position, sourceBuffer, sizeof(float) * 3); memcpy(&_position, sourceBuffer, sizeof(float) * 3);
sourceBuffer += sizeof(float) * 3; sourceBuffer += sizeof(float) * 3;

View file

@ -82,9 +82,6 @@ public:
int getBroadcastData(unsigned char* destinationBuffer); int getBroadcastData(unsigned char* destinationBuffer);
int parseData(unsigned char* sourceBuffer, int numBytes); int parseData(unsigned char* sourceBuffer, int numBytes);
QUuid& getUUID() { return _uuid; }
void setUUID(const QUuid& uuid) { _uuid = uuid; }
// Body Rotation // Body Rotation
float getBodyYaw() const { return _bodyYaw; } float getBodyYaw() const { return _bodyYaw; }
void setBodyYaw(float bodyYaw) { _bodyYaw = bodyYaw; } void setBodyYaw(float bodyYaw) { _bodyYaw = bodyYaw; }
@ -137,8 +134,6 @@ public:
} }
protected: protected:
QUuid _uuid;
glm::vec3 _position; glm::vec3 _position;
glm::vec3 _handPosition; glm::vec3 _handPosition;

View file

@ -17,7 +17,7 @@
#include "OctreeServer.h" #include "OctreeServer.h"
/// Threaded processor for sending voxel packets to a single client /// Threaded processor for sending voxel packets to a single client
class OctreeSendThread : public virtual GenericThread { class OctreeSendThread : public GenericThread {
public: public:
OctreeSendThread(const QUuid& nodeUUID, OctreeServer* myServer); OctreeSendThread(const QUuid& nodeUUID, OctreeServer* myServer);

View file

@ -16,13 +16,13 @@
#include "JurisdictionListener.h" #include "JurisdictionListener.h"
JurisdictionListener::JurisdictionListener(NODE_TYPE type, PacketSenderNotify* notify) : JurisdictionListener::JurisdictionListener(NODE_TYPE type, PacketSenderNotify* notify) :
PacketSender(notify, JurisdictionListener::DEFAULT_PACKETS_PER_SECOND) _packetSender(notify, JurisdictionListener::DEFAULT_PACKETS_PER_SECOND)
{ {
_nodeType = type; _nodeType = type;
ReceivedPacketProcessor::_dontSleep = true; // we handle sleeping so this class doesn't need to ReceivedPacketProcessor::_dontSleep = true; // we handle sleeping so this class doesn't need to
// connect(nodeList, &NodeList::nodeKilled, this, &JurisdictionListener::nodeKilled); connect(NodeList::getInstance(), &NodeList::nodeKilled, this, &JurisdictionListener::nodeKilled);
// qDebug("JurisdictionListener::JurisdictionListener(NODE_TYPE type=%c)\n", type); //qDebug("JurisdictionListener::JurisdictionListener(NODE_TYPE type=%c)", type);
} }
void JurisdictionListener::nodeKilled(SharedNodePointer node) { void JurisdictionListener::nodeKilled(SharedNodePointer node) {
@ -32,7 +32,7 @@ void JurisdictionListener::nodeKilled(SharedNodePointer node) {
} }
bool JurisdictionListener::queueJurisdictionRequest() { bool JurisdictionListener::queueJurisdictionRequest() {
//qDebug() << "JurisdictionListener::queueJurisdictionRequest()\n"; //qDebug() << "JurisdictionListener::queueJurisdictionRequest()";
static unsigned char buffer[MAX_PACKET_SIZE]; static unsigned char buffer[MAX_PACKET_SIZE];
unsigned char* bufferOut = &buffer[0]; unsigned char* bufferOut = &buffer[0];
@ -45,15 +45,15 @@ bool JurisdictionListener::queueJurisdictionRequest() {
if (nodeList->getNodeActiveSocketOrPing(node.data()) && if (nodeList->getNodeActiveSocketOrPing(node.data()) &&
node->getType() == getNodeType()) { node->getType() == getNodeType()) {
const HifiSockAddr* nodeAddress = node->getActiveSocket(); const HifiSockAddr* nodeAddress = node->getActiveSocket();
PacketSender::queuePacketForSending(*nodeAddress, bufferOut, sizeOut); _packetSender.queuePacketForSending(*nodeAddress, bufferOut, sizeOut);
nodeCount++; nodeCount++;
} }
} }
if (nodeCount > 0){ if (nodeCount > 0){
setPacketsPerSecond(nodeCount); _packetSender.setPacketsPerSecond(nodeCount);
} else { } else {
setPacketsPerSecond(NO_SERVER_CHECK_RATE); _packetSender.setPacketsPerSecond(NO_SERVER_CHECK_RATE);
} }
// keep going if still running // keep going if still running
@ -61,6 +61,7 @@ bool JurisdictionListener::queueJurisdictionRequest() {
} }
void JurisdictionListener::processPacket(const HifiSockAddr& senderAddress, unsigned char* packetData, ssize_t packetLength) { void JurisdictionListener::processPacket(const HifiSockAddr& senderAddress, unsigned char* packetData, ssize_t packetLength) {
//qDebug() << "JurisdictionListener::processPacket()";
if (packetData[0] == PACKET_TYPE_JURISDICTION) { if (packetData[0] == PACKET_TYPE_JURISDICTION) {
SharedNodePointer node = NodeList::getInstance()->nodeWithAddress(senderAddress); SharedNodePointer node = NodeList::getInstance()->nodeWithAddress(senderAddress);
if (node) { if (node) {
@ -73,12 +74,17 @@ void JurisdictionListener::processPacket(const HifiSockAddr& senderAddress, unsi
} }
bool JurisdictionListener::process() { bool JurisdictionListener::process() {
//qDebug() << "JurisdictionListener::process()";
bool continueProcessing = isStillRunning(); bool continueProcessing = isStillRunning();
// If we're still running, and we don't have any requests waiting to be sent, then queue our jurisdiction requests // If we're still running, and we don't have any requests waiting to be sent, then queue our jurisdiction requests
if (continueProcessing && !hasPacketsToSend()) { if (continueProcessing && !_packetSender.hasPacketsToSend()) {
queueJurisdictionRequest(); queueJurisdictionRequest();
continueProcessing = PacketSender::process(); }
if (continueProcessing) {
//qDebug() << "JurisdictionListener::process() calling _packetSender.process()";
continueProcessing = _packetSender.process();
} }
if (continueProcessing) { if (continueProcessing) {
// NOTE: This will sleep if there are no pending packets to process // NOTE: This will sleep if there are no pending packets to process

View file

@ -22,7 +22,7 @@
/// the PACKET_TYPE_JURISDICTION packets it receives in order to maintain an accurate state of all jurisidictions /// the PACKET_TYPE_JURISDICTION packets it receives in order to maintain an accurate state of all jurisidictions
/// within the domain. As with other ReceivedPacketProcessor classes the user is responsible for reading inbound packets /// within the domain. As with other ReceivedPacketProcessor classes the user is responsible for reading inbound packets
/// and adding them to the processing queue by calling queueReceivedPacket() /// and adding them to the processing queue by calling queueReceivedPacket()
class JurisdictionListener : public PacketSender, public ReceivedPacketProcessor { class JurisdictionListener : public ReceivedPacketProcessor {
public: public:
static const int DEFAULT_PACKETS_PER_SECOND = 1; static const int DEFAULT_PACKETS_PER_SECOND = 1;
static const int NO_SERVER_CHECK_RATE = 60; // if no servers yet detected, keep checking at 60fps static const int NO_SERVER_CHECK_RATE = 60; // if no servers yet detected, keep checking at 60fps
@ -55,5 +55,7 @@ private:
NODE_TYPE _nodeType; NODE_TYPE _nodeType;
bool queueJurisdictionRequest(); bool queueJurisdictionRequest();
PacketSender _packetSender;
}; };
#endif // __shared__JurisdictionListener__ #endif // __shared__JurisdictionListener__

View file

@ -331,16 +331,20 @@ int JurisdictionMap::unpackFromMessage(unsigned char* sourceBuffer, int availabl
// increment to push past the packet header // increment to push past the packet header
int numBytesPacketHeader = numBytesForPacketHeader(sourceBuffer); int numBytesPacketHeader = numBytesForPacketHeader(sourceBuffer);
sourceBuffer += numBytesPacketHeader; sourceBuffer += numBytesPacketHeader;
int remainingBytes = availableBytes - numBytesPacketHeader;
// read the root jurisdiction // read the root jurisdiction
int bytes = 0; int bytes = 0;
memcpy(&bytes, sourceBuffer, sizeof(bytes)); memcpy(&bytes, sourceBuffer, sizeof(bytes));
sourceBuffer += sizeof(bytes); sourceBuffer += sizeof(bytes);
remainingBytes -= sizeof(bytes);
if (bytes > 0) { if (bytes > 0 && bytes <= remainingBytes) {
_rootOctalCode = new unsigned char[bytes]; _rootOctalCode = new unsigned char[bytes];
memcpy(_rootOctalCode, sourceBuffer, bytes); memcpy(_rootOctalCode, sourceBuffer, bytes);
sourceBuffer += bytes; sourceBuffer += bytes;
remainingBytes -= bytes;
// if and only if there's a root jurisdiction, also include the end nodes // if and only if there's a root jurisdiction, also include the end nodes
int endNodeCount = 0; int endNodeCount = 0;
memcpy(&endNodeCount, sourceBuffer, sizeof(endNodeCount)); memcpy(&endNodeCount, sourceBuffer, sizeof(endNodeCount));
@ -349,13 +353,18 @@ int JurisdictionMap::unpackFromMessage(unsigned char* sourceBuffer, int availabl
int bytes = 0; int bytes = 0;
memcpy(&bytes, sourceBuffer, sizeof(bytes)); memcpy(&bytes, sourceBuffer, sizeof(bytes));
sourceBuffer += sizeof(bytes); sourceBuffer += sizeof(bytes);
unsigned char* endNodeCode = new unsigned char[bytes]; remainingBytes -= sizeof(bytes);
memcpy(endNodeCode, sourceBuffer, bytes);
sourceBuffer += bytes;
// if the endNodeCode was 0 length then don't add it if (bytes <= remainingBytes) {
if (bytes > 0) { unsigned char* endNodeCode = new unsigned char[bytes];
_endNodes.push_back(endNodeCode); memcpy(endNodeCode, sourceBuffer, bytes);
sourceBuffer += bytes;
remainingBytes -= bytes;
// if the endNodeCode was 0 length then don't add it
if (bytes > 0) {
_endNodes.push_back(endNodeCode);
}
} }
} }
} }

View file

@ -17,9 +17,9 @@
JurisdictionSender::JurisdictionSender(JurisdictionMap* map, NODE_TYPE type, PacketSenderNotify* notify) : JurisdictionSender::JurisdictionSender(JurisdictionMap* map, NODE_TYPE type, PacketSenderNotify* notify) :
PacketSender(notify, JurisdictionSender::DEFAULT_PACKETS_PER_SECOND),
ReceivedPacketProcessor(), ReceivedPacketProcessor(),
_jurisdictionMap(map) _jurisdictionMap(map),
_packetSender(notify, JurisdictionSender::DEFAULT_PACKETS_PER_SECOND)
{ {
_nodeType = type; _nodeType = type;
} }
@ -66,16 +66,16 @@ bool JurisdictionSender::process() {
if (node->getActiveSocket() != NULL) { if (node->getActiveSocket() != NULL) {
const HifiSockAddr* nodeAddress = node->getActiveSocket(); const HifiSockAddr* nodeAddress = node->getActiveSocket();
queuePacketForSending(*nodeAddress, bufferOut, sizeOut); _packetSender.queuePacketForSending(*nodeAddress, bufferOut, sizeOut);
nodeCount++; nodeCount++;
} }
} }
unlockRequestingNodes(); unlockRequestingNodes();
// set our packets per second to be the number of nodes // set our packets per second to be the number of nodes
setPacketsPerSecond(nodeCount); _packetSender.setPacketsPerSecond(nodeCount);
continueProcessing = PacketSender::process(); continueProcessing = _packetSender.process();
} }
return continueProcessing; return continueProcessing;
} }

View file

@ -21,7 +21,7 @@
/// Will process PACKET_TYPE_JURISDICTION_REQUEST packets and send out PACKET_TYPE_JURISDICTION packets /// Will process PACKET_TYPE_JURISDICTION_REQUEST packets and send out PACKET_TYPE_JURISDICTION packets
/// to requesting parties. As with other ReceivedPacketProcessor classes the user is responsible for reading inbound packets /// to requesting parties. As with other ReceivedPacketProcessor classes the user is responsible for reading inbound packets
/// and adding them to the processing queue by calling queueReceivedPacket() /// and adding them to the processing queue by calling queueReceivedPacket()
class JurisdictionSender : public PacketSender, public ReceivedPacketProcessor { class JurisdictionSender : public ReceivedPacketProcessor {
Q_OBJECT Q_OBJECT
public: public:
static const int DEFAULT_PACKETS_PER_SECOND = 1; static const int DEFAULT_PACKETS_PER_SECOND = 1;
@ -51,5 +51,7 @@ private:
JurisdictionMap* _jurisdictionMap; JurisdictionMap* _jurisdictionMap;
std::queue<QUuid> _nodesRequestingJurisdictions; std::queue<QUuid> _nodesRequestingJurisdictions;
NODE_TYPE _nodeType; NODE_TYPE _nodeType;
PacketSender _packetSender;
}; };
#endif // __shared__JurisdictionSender__ #endif // __shared__JurisdictionSender__

View file

@ -46,7 +46,7 @@ void OctreeScriptingInterface::init() {
} else { } else {
_managedJurisdictionListener = true; _managedJurisdictionListener = true;
_jurisdictionListener = new JurisdictionListener(getServerNodeType()); _jurisdictionListener = new JurisdictionListener(getServerNodeType());
//printf("OctreeScriptingInterface::init() _managedJurisdictionListener=true, creating _jurisdictionListener=%p\n", _jurisdictionListener); //qDebug("OctreeScriptingInterface::init() _managedJurisdictionListener=true, creating _jurisdictionListener=%p", _jurisdictionListener);
_jurisdictionListener->initialize(true); _jurisdictionListener->initialize(true);
} }
@ -55,7 +55,7 @@ void OctreeScriptingInterface::init() {
} else { } else {
_managedPacketSender = true; _managedPacketSender = true;
_packetSender = createPacketSender(); _packetSender = createPacketSender();
//printf("OctreeScriptingInterface::init() _managedPacketSender=true, creating _packetSender=%p\n", _packetSender); //qDebug("OctreeScriptingInterface::init() _managedPacketSender=true, creating _packetSender=%p", _packetSender);
_packetSender->setServerJurisdictions(_jurisdictionListener->getJurisdictions()); _packetSender->setServerJurisdictions(_jurisdictionListener->getJurisdictions());
} }
} }

View file

@ -136,6 +136,9 @@ public:
ParticleID(uint32_t id, uint32_t creatorTokenID, bool isKnownID) : ParticleID(uint32_t id, uint32_t creatorTokenID, bool isKnownID) :
id(id), creatorTokenID(creatorTokenID), isKnownID(isKnownID) { }; id(id), creatorTokenID(creatorTokenID), isKnownID(isKnownID) { };
ParticleID(uint32_t id) :
id(id), creatorTokenID(UNKNOWN_TOKEN), isKnownID(true) { };
uint32_t id; uint32_t id;
uint32_t creatorTokenID; uint32_t creatorTokenID;
bool isKnownID; bool isKnownID;

View file

@ -16,7 +16,6 @@
#include "Particle.h" #include "Particle.h"
#include "ParticleCollisionSystem.h" #include "ParticleCollisionSystem.h"
#include "ParticleEditHandle.h"
#include "ParticleEditPacketSender.h" #include "ParticleEditPacketSender.h"
#include "ParticleTree.h" #include "ParticleTree.h"
@ -117,19 +116,23 @@ void ParticleCollisionSystem::updateCollisionWithParticles(Particle* particleA)
float massB = (particleB->getInHand()) ? MAX_MASS : particleB->getMass(); float massB = (particleB->getInHand()) ? MAX_MASS : particleB->getMass();
float totalMass = massA + massB; float totalMass = massA + massB;
// handle A particle
particleA->setVelocity(particleA->getVelocity() - axialVelocity * (2.0f * massB / totalMass)); particleA->setVelocity(particleA->getVelocity() - axialVelocity * (2.0f * massB / totalMass));
ParticleProperties propertiesA;
ParticleID particleAid(particleA->getID());
propertiesA.copyFromParticle(*particleA);
propertiesA.setVelocity(particleA->getVelocity() * (float)TREE_SCALE);
_packetSender->queueParticleEditMessage(PACKET_TYPE_PARTICLE_ADD_OR_EDIT, particleAid, propertiesA);
ParticleEditHandle particleEditHandle(_packetSender, _particles, particleA->getID()); // handle B particle
particleEditHandle.updateParticle(particleA->getPosition(), particleA->getRadius(), particleA->getXColor(),
particleA->getVelocity(), particleA->getGravity(), particleA->getDamping(), particleA->getLifetime(),
particleA->getInHand(), particleA->getScript());
particleB->setVelocity(particleB->getVelocity() + axialVelocity * (2.0f * massA / totalMass)); particleB->setVelocity(particleB->getVelocity() + axialVelocity * (2.0f * massA / totalMass));
ParticleProperties propertiesB;
ParticleID particleBid(particleB->getID());
propertiesB.copyFromParticle(*particleB);
propertiesB.setVelocity(particleB->getVelocity() * (float)TREE_SCALE);
_packetSender->queueParticleEditMessage(PACKET_TYPE_PARTICLE_ADD_OR_EDIT, particleBid, propertiesB);
ParticleEditHandle penetratedparticleEditHandle(_packetSender, _particles, particleB->getID()); _packetSender->releaseQueuedMessages();
penetratedparticleEditHandle.updateParticle(particleB->getPosition(), particleB->getRadius(),
particleB->getXColor(), particleB->getVelocity(), particleB->getGravity(), particleB->getDamping(),
particleB->getLifetime(), particleB->getInHand(), particleB->getScript());
penetration /= (float)(TREE_SCALE); penetration /= (float)(TREE_SCALE);
updateCollisionSound(particleA, penetration, COLLISION_FREQUENCY); updateCollisionSound(particleA, penetration, COLLISION_FREQUENCY);
@ -256,10 +259,17 @@ void ParticleCollisionSystem::applyHardCollision(Particle* particle, float elast
particle->getID(), velocity.x, velocity.y, velocity.z, debug::valueOf(particle->getInHand())); particle->getID(), velocity.x, velocity.y, velocity.z, debug::valueOf(particle->getInHand()));
} }
ParticleEditHandle particleEditHandle(_packetSender, _particles, particle->getID()); // send off the result to the particle server
particleEditHandle.updateParticle(position, particle->getRadius(), particle->getXColor(), velocity, ParticleProperties properties;
particle->getGravity(), particle->getDamping(), particle->getLifetime(), ParticleID particleID(particle->getID());
particle->getInHand(), particle->getScript()); properties.copyFromParticle(*particle);
properties.setPosition(position * (float)TREE_SCALE);
properties.setVelocity(velocity * (float)TREE_SCALE);
_packetSender->queueParticleEditMessage(PACKET_TYPE_PARTICLE_ADD_OR_EDIT, particleID, properties);
// change the local particle too...
particle->setPosition(position);
particle->setVelocity(velocity);
} }

View file

@ -1,116 +0,0 @@
//
// ParticleEditHandle.cpp
// hifi
//
// Created by Brad Hefta-Gaub on 12/4/13.
// Copyright (c) 2013 High Fidelity, Inc. All rights reserved.
//
//
#include "Particle.h"
#include "ParticleEditHandle.h"
#include "ParticleEditPacketSender.h"
#include "ParticleTree.h"
std::map<uint32_t,ParticleEditHandle*> ParticleEditHandle::_allHandles;
ParticleEditHandle::ParticleEditHandle(ParticleEditPacketSender* packetSender, ParticleTree* localTree, uint32_t id) {
if (id == NEW_PARTICLE) {
_creatorTokenID = Particle::getNextCreatorTokenID();
_id = NEW_PARTICLE;
_isKnownID = false;
_allHandles[_creatorTokenID] = this;
} else {
_creatorTokenID = UNKNOWN_TOKEN;
_id = id;
_isKnownID = true;
// don't add to _allHandles because we already know it...
}
_packetSender = packetSender;
_localTree = localTree;
}
ParticleEditHandle::~ParticleEditHandle() {
// remove us from our _allHandles map
if (_creatorTokenID != UNKNOWN_TOKEN) {
_allHandles.erase(_allHandles.find(_creatorTokenID));
}
}
void ParticleEditHandle::createParticle(glm::vec3 position, float radius, xColor color, glm::vec3 velocity,
glm::vec3 gravity, float damping, float lifetime, bool inHand, QString updateScript) {
// setup a ParticleDetail struct with the data
/****
uint64_t now = usecTimestampNow();
ParticleDetail addParticleDetail = { NEW_PARTICLE, now,
position, radius, {color.red, color.green, color.blue },
velocity, gravity, damping, lifetime, inHand, updateScript, _creatorTokenID };
// queue the packet
_packetSender->queueParticleEditMessage(PACKET_TYPE_PARTICLE_ADD_OR_EDIT, 1, &addParticleDetail);
// release them
_packetSender->releaseQueuedMessages();
// if we have a local tree, also update it...
if (_localTree) {
// we can't really do this here, because if we create a particle locally, we'll get a ghost particle
// because we can't really handle updating/deleting it locally
}
****/
}
bool ParticleEditHandle::updateParticle(glm::vec3 position, float radius, xColor color, glm::vec3 velocity,
glm::vec3 gravity, float damping, float lifetime, bool inHand, QString updateScript) {
if (!isKnownID()) {
return false; // not allowed until we know the id
}
// setup a ParticleDetail struct with the data
/****
uint64_t now = usecTimestampNow();
ParticleDetail newParticleDetail = { _id, now,
position, radius, {color.red, color.green, color.blue },
velocity, gravity, damping, lifetime, inHand, updateScript, _creatorTokenID };
// queue the packet
_packetSender->queueParticleEditMessages(PACKET_TYPE_PARTICLE_ADD_OR_EDIT, 1, &newParticleDetail);
// release them
_packetSender->releaseQueuedMessages();
// if we have a local tree, also update it...
if (_localTree) {
rgbColor rcolor = {color.red, color.green, color.blue };
Particle tempParticle(position, radius, rcolor, velocity, gravity, damping, lifetime, inHand, updateScript, _id);
_localTree->storeParticle(tempParticle);
}
***/
return true;
}
void ParticleEditHandle::handleAddResponse(unsigned char* packetData , int packetLength) {
unsigned char* dataAt = packetData;
int numBytesPacketHeader = numBytesForPacketHeader(packetData);
dataAt += numBytesPacketHeader;
uint32_t creatorTokenID;
memcpy(&creatorTokenID, dataAt, sizeof(creatorTokenID));
dataAt += sizeof(creatorTokenID);
uint32_t particleID;
memcpy(&particleID, dataAt, sizeof(particleID));
dataAt += sizeof(particleID);
// find this particle in the _allHandles map
if (_allHandles.find(creatorTokenID) != _allHandles.end()) {
ParticleEditHandle* theHandle = _allHandles[creatorTokenID];
theHandle->_id = particleID;
theHandle->_isKnownID = true;
}
}

View file

@ -1,53 +0,0 @@
//
// ParticleEditHandle.h
// hifi
//
// Created by Brad Hefta-Gaub on 12/4/13.
// Copyright (c) 2013 High Fidelity, Inc. All rights reserved.
//
//
#ifndef __hifi__ParticleEditHandle__
#define __hifi__ParticleEditHandle__
#include <glm/glm.hpp>
#include <stdint.h>
#include <QtScript/QScriptEngine>
#include <QtCore/QObject>
#include <SharedUtil.h>
#include <OctreePacketData.h>
#include "Particle.h"
class ParticleEditPacketSender;
class ParticleTree;
class ParticleEditHandle {
public:
ParticleEditHandle(ParticleEditPacketSender* packetSender, ParticleTree* localTree, uint32_t id = NEW_PARTICLE);
~ParticleEditHandle();
uint32_t getCreatorTokenID() const { return _creatorTokenID; }
uint32_t getID() const { return _id; }
bool isKnownID() const { return _isKnownID; }
void createParticle(glm::vec3 position, float radius, xColor color, glm::vec3 velocity,
glm::vec3 gravity, float damping, float lifetime, bool inHand, QString updateScript);
bool updateParticle(glm::vec3 position, float radius, xColor color, glm::vec3 velocity,
glm::vec3 gravity, float damping, float lifetime, bool inHand, QString updateScript);
static void handleAddResponse(unsigned char* packetData , int packetLength);
private:
uint32_t _creatorTokenID;
uint32_t _id;
bool _isKnownID;
static std::map<uint32_t,ParticleEditHandle*> _allHandles;
ParticleEditPacketSender* _packetSender;
ParticleTree* _localTree;
};
#endif /* defined(__hifi__ParticleEditHandle__) */

View file

@ -42,7 +42,8 @@ void ParticleEditPacketSender::adjustEditPacketForClockSkew(unsigned char* codeC
} }
void ParticleEditPacketSender::queueParticleEditMessage(PACKET_TYPE type, ParticleID particleID, const ParticleProperties& properties) { void ParticleEditPacketSender::queueParticleEditMessage(PACKET_TYPE type, ParticleID particleID,
const ParticleProperties& properties) {
if (!_shouldSend) { if (!_shouldSend) {
return; // bail early return; // bail early
} }

View file

@ -21,11 +21,13 @@ public:
~ParticleEditPacketSender() { } ~ParticleEditPacketSender() { }
/// Send particle add message immediately /// Send particle add message immediately
/// NOTE: ParticleProperties assumes that all distances are in meter units
void sendEditParticleMessage(PACKET_TYPE type, ParticleID particleID, const ParticleProperties& properties); void sendEditParticleMessage(PACKET_TYPE type, ParticleID particleID, const ParticleProperties& properties);
/// Queues an array of several voxel edit messages. Will potentially send a pending multi-command packet. Determines /// Queues an array of several voxel edit messages. Will potentially send a pending multi-command packet. Determines
/// which voxel-server node or nodes the packet should be sent to. Can be called even before voxel servers are known, in /// which voxel-server node or nodes the packet should be sent to. Can be called even before voxel servers are known, in
/// which case up to MaxPendingMessages will be buffered and processed when voxel servers are known. /// which case up to MaxPendingMessages will be buffered and processed when voxel servers are known.
/// NOTE: ParticleProperties assumes that all distances are in meter units
void queueParticleEditMessage(PACKET_TYPE type, ParticleID particleID, const ParticleProperties& properties); void queueParticleEditMessage(PACKET_TYPE type, ParticleID particleID, const ParticleProperties& properties);
// My server type is the particle server // My server type is the particle server

View file

@ -11,7 +11,6 @@
#include <QtCore/QObject> #include <QtCore/QObject>
#include <JurisdictionListener.h>
#include <OctreeScriptingInterface.h> #include <OctreeScriptingInterface.h>
#include "ParticleEditPacketSender.h" #include "ParticleEditPacketSender.h"

View file

@ -7,15 +7,15 @@
// //
#include <DataServerClient.h> #include <DataServerClient.h>
#include <NodeList.h>
#include "DataServerScriptingInterface.h" #include "DataServerScriptingInterface.h"
DataServerScriptingInterface::DataServerScriptingInterface() : DataServerScriptingInterface::DataServerScriptingInterface()
_uuid(QUuid::createUuid())
{ {
} }
void DataServerScriptingInterface::setValueForKey(const QString& key, const QString& value) { void DataServerScriptingInterface::setValueForKey(const QString& key, const QString& value) {
DataServerClient::putValueForKeyAndUUID(key, value, _uuid); DataServerClient::putValueForKeyAndUUID(key, value, NodeList::getInstance()->getOwnerUUID());
} }

View file

@ -18,13 +18,8 @@ class DataServerScriptingInterface : public QObject {
public: public:
DataServerScriptingInterface(); DataServerScriptingInterface();
void refreshUUID() { _uuid = QUuid::createUuid(); }
const QUuid& getUUID() const { return _uuid; }
public slots: public slots:
void setValueForKey(const QString& key, const QString& value); void setValueForKey(const QString& key, const QString& value);
private:
QUuid _uuid;
}; };
#endif /* defined(__hifi__DataServerScriptingInterface__) */ #endif /* defined(__hifi__DataServerScriptingInterface__) */

View file

@ -41,6 +41,7 @@ static QScriptValue soundConstructor(QScriptContext* context, QScriptEngine* eng
ScriptEngine::ScriptEngine(const QString& scriptContents, bool wantMenuItems, const QString& fileNameString, AbstractMenuInterface* menu, ScriptEngine::ScriptEngine(const QString& scriptContents, bool wantMenuItems, const QString& fileNameString, AbstractMenuInterface* menu,
AbstractControllerScriptingInterface* controllerScriptingInterface) : AbstractControllerScriptingInterface* controllerScriptingInterface) :
_dataServerScriptingInterface(),
_avatarData(NULL) _avatarData(NULL)
{ {
_scriptContents = scriptContents; _scriptContents = scriptContents;
@ -159,10 +160,6 @@ void ScriptEngine::registerGlobalObject(const QString& name, QObject* object) {
_engine.globalObject().setProperty(name, value); _engine.globalObject().setProperty(name, value);
} }
void ScriptEngine::preEvaluateReset() {
_dataServerScriptingInterface.refreshUUID();
}
void ScriptEngine::evaluate() { void ScriptEngine::evaluate() {
if (!_isInitialized) { if (!_isInitialized) {
init(); init();
@ -248,9 +245,7 @@ void ScriptEngine::run() {
numAvatarHeaderBytes = populateTypeAndVersion(avatarPacket, PACKET_TYPE_HEAD_DATA); numAvatarHeaderBytes = populateTypeAndVersion(avatarPacket, PACKET_TYPE_HEAD_DATA);
// pack the owner UUID for this script // pack the owner UUID for this script
QByteArray ownerUUID = nodeList->getOwnerUUID().toRfc4122(); numAvatarHeaderBytes += NodeList::getInstance()->packOwnerUUID(avatarPacket);
memcpy(avatarPacket + numAvatarHeaderBytes, ownerUUID.constData(), ownerUUID.size());
numAvatarHeaderBytes += ownerUUID.size();
} }
int numAvatarPacketBytes = _avatarData->getBroadcastData(avatarPacket + numAvatarHeaderBytes) + numAvatarHeaderBytes; int numAvatarPacketBytes = _avatarData->getBroadcastData(avatarPacket + numAvatarHeaderBytes) + numAvatarHeaderBytes;

View file

@ -74,7 +74,6 @@ signals:
void finished(const QString& fileNameString); void finished(const QString& fileNameString);
protected: protected:
void preEvaluateReset();
QString _scriptContents; QString _scriptContents;
bool _isFinished; bool _isFinished;

View file

@ -642,6 +642,12 @@ void NodeList::sendAssignment(Assignment& assignment) {
assignmentServerSocket->getPort()); assignmentServerSocket->getPort());
} }
int NodeList::packOwnerUUID(unsigned char* packetData) {
QByteArray rfcUUID = _ownerUUID.toRfc4122();
memcpy(packetData, rfcUUID.constData(), rfcUUID.size());
return rfcUUID.size();
}
int NodeList::fillPingPacket(unsigned char* buffer) { int NodeList::fillPingPacket(unsigned char* buffer) {
int numHeaderBytes = populateTypeAndVersion(buffer, PACKET_TYPE_PING); int numHeaderBytes = populateTypeAndVersion(buffer, PACKET_TYPE_PING);
uint64_t currentTime = usecTimestampNow(); uint64_t currentTime = usecTimestampNow();

View file

@ -96,6 +96,8 @@ public:
void setAssignmentServerSocket(const HifiSockAddr& serverSocket) { _assignmentServerSocket = serverSocket; } void setAssignmentServerSocket(const HifiSockAddr& serverSocket) { _assignmentServerSocket = serverSocket; }
void sendAssignment(Assignment& assignment); void sendAssignment(Assignment& assignment);
int packOwnerUUID(unsigned char* packetData);
int fillPingPacket(unsigned char* buffer); int fillPingPacket(unsigned char* buffer);
int fillPingReplyPacket(unsigned char* pingBuffer, unsigned char* replyBuffer); int fillPingReplyPacket(unsigned char* pingBuffer, unsigned char* replyBuffer);

View file

@ -20,7 +20,7 @@ PACKET_VERSION versionForPacketType(PACKET_TYPE type) {
return 2; return 2;
case PACKET_TYPE_HEAD_DATA: case PACKET_TYPE_HEAD_DATA:
return 15; return 16;
case PACKET_TYPE_OCTREE_STATS: case PACKET_TYPE_OCTREE_STATS:
return 2; return 2;

View file

@ -23,7 +23,7 @@ public:
/// Generalized threaded processor for queueing and sending of outbound packets. /// Generalized threaded processor for queueing and sending of outbound packets.
class PacketSender : public virtual GenericThread { class PacketSender : public GenericThread {
public: public:
static const uint64_t USECS_PER_SECOND; static const uint64_t USECS_PER_SECOND;

View file

@ -15,7 +15,7 @@
#include "NetworkPacket.h" #include "NetworkPacket.h"
/// Generalized threaded processor for handling received inbound packets. /// Generalized threaded processor for handling received inbound packets.
class ReceivedPacketProcessor : public virtual GenericThread { class ReceivedPacketProcessor : public GenericThread {
public: public:
ReceivedPacketProcessor(); ReceivedPacketProcessor();

View file

@ -11,7 +11,6 @@
#include <QtCore/QObject> #include <QtCore/QObject>
#include <JurisdictionListener.h>
#include <OctreeScriptingInterface.h> #include <OctreeScriptingInterface.h>
#include "VoxelConstants.h" #include "VoxelConstants.h"