mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-09 00:07:31 +02:00
Merge branch 'master' of https://github.com/worklist/hifi
This commit is contained in:
commit
bacfa15065
37 changed files with 146 additions and 324 deletions
|
@ -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");
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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());
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 &&
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
|
|
||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
|
|
||||||
class UpdateDialog : public QWidget {
|
class UpdateDialog : public QDialog {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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__
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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__
|
||||||
|
|
|
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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__) */
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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"
|
||||||
|
|
||||||
|
|
|
@ -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());
|
||||||
}
|
}
|
|
@ -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__) */
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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"
|
||||||
|
|
Loading…
Reference in a new issue