mirror of
https://github.com/overte-org/overte.git
synced 2025-08-10 11:13:09 +02:00
Looks like serialization order must be same a flag enum order!?
Also resuscitate EntityItem debug dumps.
This commit is contained in:
parent
8033e93eda
commit
16bc667b95
11 changed files with 156 additions and 16 deletions
|
@ -23,6 +23,7 @@
|
||||||
#include <QtCore/QRegularExpression>
|
#include <QtCore/QRegularExpression>
|
||||||
#include <QtCore/QTimer>
|
#include <QtCore/QTimer>
|
||||||
#include <QtCore/QThread>
|
#include <QtCore/QThread>
|
||||||
|
#include <QtCore/QJsonDocument>
|
||||||
|
|
||||||
#include <AABox.h>
|
#include <AABox.h>
|
||||||
#include <AvatarLogging.h>
|
#include <AvatarLogging.h>
|
||||||
|
@ -32,6 +33,8 @@
|
||||||
#include <SharedUtil.h>
|
#include <SharedUtil.h>
|
||||||
#include <UUID.h>
|
#include <UUID.h>
|
||||||
#include <TryLocker.h>
|
#include <TryLocker.h>
|
||||||
|
#include "../AssignmentDynamicFactory.h"
|
||||||
|
#include "../entities/AssignmentParentFinder.h"
|
||||||
|
|
||||||
const QString AVATAR_MIXER_LOGGING_NAME = "avatar-mixer";
|
const QString AVATAR_MIXER_LOGGING_NAME = "avatar-mixer";
|
||||||
|
|
||||||
|
@ -42,6 +45,9 @@ AvatarMixer::AvatarMixer(ReceivedMessage& message) :
|
||||||
ThreadedAssignment(message),
|
ThreadedAssignment(message),
|
||||||
_slavePool(&_slaveSharedData)
|
_slavePool(&_slaveSharedData)
|
||||||
{
|
{
|
||||||
|
DependencyManager::registerInheritance<EntityDynamicFactoryInterface, AssignmentDynamicFactory>();
|
||||||
|
DependencyManager::set<AssignmentDynamicFactory>();
|
||||||
|
|
||||||
// make sure we hear about node kills so we can tell the other nodes
|
// make sure we hear about node kills so we can tell the other nodes
|
||||||
connect(DependencyManager::get<NodeList>().data(), &NodeList::nodeKilled, this, &AvatarMixer::handleAvatarKilled);
|
connect(DependencyManager::get<NodeList>().data(), &NodeList::nodeKilled, this, &AvatarMixer::handleAvatarKilled);
|
||||||
|
|
||||||
|
@ -56,6 +62,8 @@ AvatarMixer::AvatarMixer(ReceivedMessage& message) :
|
||||||
packetReceiver.registerListener(PacketType::RequestsDomainListData, this, "handleRequestsDomainListDataPacket");
|
packetReceiver.registerListener(PacketType::RequestsDomainListData, this, "handleRequestsDomainListDataPacket");
|
||||||
packetReceiver.registerListener(PacketType::SetAvatarTraits, this, "queueIncomingPacket");
|
packetReceiver.registerListener(PacketType::SetAvatarTraits, this, "queueIncomingPacket");
|
||||||
packetReceiver.registerListener(PacketType::BulkAvatarTraitsAck, this, "queueIncomingPacket");
|
packetReceiver.registerListener(PacketType::BulkAvatarTraitsAck, this, "queueIncomingPacket");
|
||||||
|
packetReceiver.registerListenerForTypes({ PacketType::OctreeStats, PacketType::EntityData, PacketType::EntityErase },
|
||||||
|
this, "handleOctreePacket");
|
||||||
|
|
||||||
packetReceiver.registerListenerForTypes({
|
packetReceiver.registerListenerForTypes({
|
||||||
PacketType::ReplicatedAvatarIdentity,
|
PacketType::ReplicatedAvatarIdentity,
|
||||||
|
@ -227,6 +235,10 @@ void AvatarMixer::start() {
|
||||||
|
|
||||||
int lockWait, nodeTransform, functor;
|
int lockWait, nodeTransform, functor;
|
||||||
|
|
||||||
|
{
|
||||||
|
_entityViewer.queryOctree();
|
||||||
|
}
|
||||||
|
|
||||||
// Allow nodes to process any pending/queued packets across our worker threads
|
// Allow nodes to process any pending/queued packets across our worker threads
|
||||||
{
|
{
|
||||||
auto start = usecTimestampNow();
|
auto start = usecTimestampNow();
|
||||||
|
@ -847,13 +859,15 @@ AvatarMixerClientData* AvatarMixer::getOrCreateClientData(SharedNodePointer node
|
||||||
void AvatarMixer::domainSettingsRequestComplete() {
|
void AvatarMixer::domainSettingsRequestComplete() {
|
||||||
auto nodeList = DependencyManager::get<NodeList>();
|
auto nodeList = DependencyManager::get<NodeList>();
|
||||||
nodeList->addSetOfNodeTypesToNodeInterestSet({
|
nodeList->addSetOfNodeTypesToNodeInterestSet({
|
||||||
NodeType::Agent, NodeType::EntityScriptServer,
|
NodeType::Agent, NodeType::EntityScriptServer, NodeType::EntityServer,
|
||||||
NodeType::UpstreamAvatarMixer, NodeType::DownstreamAvatarMixer
|
NodeType::UpstreamAvatarMixer, NodeType::DownstreamAvatarMixer
|
||||||
});
|
});
|
||||||
|
|
||||||
// parse the settings to pull out the values we need
|
// parse the settings to pull out the values we need
|
||||||
parseDomainServerSettings(nodeList->getDomainHandler().getSettingsObject());
|
parseDomainServerSettings(nodeList->getDomainHandler().getSettingsObject());
|
||||||
|
|
||||||
|
setupEntityQuery();
|
||||||
|
|
||||||
// start our tight loop...
|
// start our tight loop...
|
||||||
start();
|
start();
|
||||||
}
|
}
|
||||||
|
@ -941,3 +955,49 @@ void AvatarMixer::parseDomainServerSettings(const QJsonObject& domainSettings) {
|
||||||
qCDebug(avatars) << "Avatars other than" << _slaveSharedData.skeletonURLWhitelist << "will be replaced by" << (_slaveSharedData.skeletonReplacementURL.isEmpty() ? "default" : _slaveSharedData.skeletonReplacementURL.toString());
|
qCDebug(avatars) << "Avatars other than" << _slaveSharedData.skeletonURLWhitelist << "will be replaced by" << (_slaveSharedData.skeletonReplacementURL.isEmpty() ? "default" : _slaveSharedData.skeletonReplacementURL.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AvatarMixer::setupEntityQuery() {
|
||||||
|
static char queryJsonString[] = R"({"avatarPriority": true})";
|
||||||
|
|
||||||
|
_entityViewer.init();
|
||||||
|
DependencyManager::registerInheritance<SpatialParentFinder, AssignmentParentFinder>();
|
||||||
|
DependencyManager::set<AssignmentParentFinder>(_entityViewer.getTree());
|
||||||
|
_slaveSharedData.entityTree = _entityViewer.getTree();
|
||||||
|
|
||||||
|
QJsonParseError jsonParseError;
|
||||||
|
const QJsonDocument priorityZoneQuery(QJsonDocument::fromJson(queryJsonString, &jsonParseError));
|
||||||
|
if (jsonParseError.error != QJsonParseError::NoError) {
|
||||||
|
qCDebug(avatars) << "Error parsing:" << queryJsonString << " - " << jsonParseError.errorString();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_entityViewer.getOctreeQuery().setJSONParameters(priorityZoneQuery.object());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void AvatarMixer::handleOctreePacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode) {
|
||||||
|
PacketType packetType = message->getType();
|
||||||
|
|
||||||
|
switch (packetType) {
|
||||||
|
case PacketType::OctreeStats:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PacketType::EntityData:
|
||||||
|
_entityViewer.processDatagram(*message, senderNode);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PacketType::EntityErase:
|
||||||
|
_entityViewer.processEraseMessage(*message, senderNode);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
qCDebug(avatars) << "Unexpected packet type:" << packetType;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AvatarMixer::aboutToFinish() {
|
||||||
|
DependencyManager::destroy<AssignmentDynamicFactory>();
|
||||||
|
DependencyManager::destroy<AssignmentParentFinder>();
|
||||||
|
|
||||||
|
ThreadedAssignment::aboutToFinish();
|
||||||
|
}
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include <PortableHighResolutionClock.h>
|
#include <PortableHighResolutionClock.h>
|
||||||
|
|
||||||
#include <ThreadedAssignment.h>
|
#include <ThreadedAssignment.h>
|
||||||
|
#include "../entities/EntityTreeHeadlessViewer.h"
|
||||||
#include "AvatarMixerClientData.h"
|
#include "AvatarMixerClientData.h"
|
||||||
|
|
||||||
#include "AvatarMixerSlavePool.h"
|
#include "AvatarMixerSlavePool.h"
|
||||||
|
@ -28,6 +29,7 @@ class AvatarMixer : public ThreadedAssignment {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
AvatarMixer(ReceivedMessage& message);
|
AvatarMixer(ReceivedMessage& message);
|
||||||
|
virtual void aboutToFinish() override;
|
||||||
|
|
||||||
static bool shouldReplicateTo(const Node& from, const Node& to) {
|
static bool shouldReplicateTo(const Node& from, const Node& to) {
|
||||||
return to.getType() == NodeType::DownstreamAvatarMixer &&
|
return to.getType() == NodeType::DownstreamAvatarMixer &&
|
||||||
|
@ -56,6 +58,7 @@ private slots:
|
||||||
void handleReplicatedBulkAvatarPacket(QSharedPointer<ReceivedMessage> message);
|
void handleReplicatedBulkAvatarPacket(QSharedPointer<ReceivedMessage> message);
|
||||||
void domainSettingsRequestComplete();
|
void domainSettingsRequestComplete();
|
||||||
void handlePacketVersionMismatch(PacketType type, const HifiSockAddr& senderSockAddr, const QUuid& senderUUID);
|
void handlePacketVersionMismatch(PacketType type, const HifiSockAddr& senderSockAddr, const QUuid& senderUUID);
|
||||||
|
void handleOctreePacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode);
|
||||||
void start();
|
void start();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -70,8 +73,13 @@ private:
|
||||||
|
|
||||||
void optionallyReplicatePacket(ReceivedMessage& message, const Node& node);
|
void optionallyReplicatePacket(ReceivedMessage& message, const Node& node);
|
||||||
|
|
||||||
|
void setupEntityQuery();
|
||||||
|
|
||||||
p_high_resolution_clock::time_point _lastFrameTimestamp;
|
p_high_resolution_clock::time_point _lastFrameTimestamp;
|
||||||
|
|
||||||
|
// Attach to entity tree for avatar-priority zone info.
|
||||||
|
EntityTreeHeadlessViewer _entityViewer;
|
||||||
|
|
||||||
// FIXME - new throttling - use these values somehow
|
// FIXME - new throttling - use these values somehow
|
||||||
float _trailingMixRatio { 0.0f };
|
float _trailingMixRatio { 0.0f };
|
||||||
float _throttlingRatio { 0.0f };
|
float _throttlingRatio { 0.0f };
|
||||||
|
|
|
@ -16,6 +16,8 @@
|
||||||
|
|
||||||
#include <DependencyManager.h>
|
#include <DependencyManager.h>
|
||||||
#include <NodeList.h>
|
#include <NodeList.h>
|
||||||
|
#include <EntityTree.h>
|
||||||
|
#include <ZoneEntityItem.h>
|
||||||
|
|
||||||
#include "AvatarMixerSlave.h"
|
#include "AvatarMixerSlave.h"
|
||||||
|
|
||||||
|
@ -62,7 +64,7 @@ int AvatarMixerClientData::processPackets(const SlaveSharedData& slaveSharedData
|
||||||
|
|
||||||
switch (packet->getType()) {
|
switch (packet->getType()) {
|
||||||
case PacketType::AvatarData:
|
case PacketType::AvatarData:
|
||||||
parseData(*packet);
|
parseData(*packet, slaveSharedData);
|
||||||
break;
|
break;
|
||||||
case PacketType::SetAvatarTraits:
|
case PacketType::SetAvatarTraits:
|
||||||
processSetTraitsMessage(*packet, slaveSharedData, *node);
|
processSetTraitsMessage(*packet, slaveSharedData, *node);
|
||||||
|
@ -80,7 +82,38 @@ int AvatarMixerClientData::processPackets(const SlaveSharedData& slaveSharedData
|
||||||
return packetsProcessed;
|
return packetsProcessed;
|
||||||
}
|
}
|
||||||
|
|
||||||
int AvatarMixerClientData::parseData(ReceivedMessage& message) {
|
namespace {
|
||||||
|
using std::static_pointer_cast;
|
||||||
|
|
||||||
|
// Operator to find if a point is within an avatar-priority (hero) Zone Entity.
|
||||||
|
struct FindPriorityZone {
|
||||||
|
glm::vec3 position;
|
||||||
|
bool isInPriorityZone { false };
|
||||||
|
static bool operation(const OctreeElementPointer& element, void* extraData) {
|
||||||
|
auto findPriorityZone = static_cast<FindPriorityZone*>(extraData);
|
||||||
|
if (element->getAACube().contains(findPriorityZone->position)) {
|
||||||
|
const EntityTreeElementPointer entityTreeElement = static_pointer_cast<EntityTreeElement>(element);
|
||||||
|
entityTreeElement->forEachEntity([&findPriorityZone](EntityItemPointer item) {
|
||||||
|
if (item->getType() == EntityTypes::Zone
|
||||||
|
&& item->contains(findPriorityZone->position)
|
||||||
|
&& static_pointer_cast<ZoneEntityItem>(item)->getAvatarPriority()) {
|
||||||
|
findPriorityZone->isInPriorityZone = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (findPriorityZone->isInPriorityZone) {
|
||||||
|
return false; // For now, stop at first hit.
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} else { // Position isn't within this subspace, so end recursion.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // Close anonymous namespace.
|
||||||
|
|
||||||
|
int AvatarMixerClientData::parseData(ReceivedMessage& message, const SlaveSharedData& slaveSharedData) {
|
||||||
// pull the sequence number from the data first
|
// pull the sequence number from the data first
|
||||||
uint16_t sequenceNumber;
|
uint16_t sequenceNumber;
|
||||||
|
|
||||||
|
@ -90,9 +123,24 @@ int AvatarMixerClientData::parseData(ReceivedMessage& message) {
|
||||||
incrementNumOutOfOrderSends();
|
incrementNumOutOfOrderSends();
|
||||||
}
|
}
|
||||||
_lastReceivedSequenceNumber = sequenceNumber;
|
_lastReceivedSequenceNumber = sequenceNumber;
|
||||||
|
glm::vec3 oldPosition = getPosition();
|
||||||
|
|
||||||
// compute the offset to the data payload
|
// compute the offset to the data payload
|
||||||
return _avatar->parseDataFromBuffer(message.readWithoutCopy(message.getBytesLeftToRead()));
|
if (!_avatar->parseDataFromBuffer(message.readWithoutCopy(message.getBytesLeftToRead()))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto newPosition = getPosition();
|
||||||
|
if (newPosition != oldPosition) {
|
||||||
|
EntityTree& entityTree = *slaveSharedData.entityTree;
|
||||||
|
FindPriorityZone findPriorityZone { newPosition, false } ;
|
||||||
|
entityTree.recurseTreeWithOperation(&FindPriorityZone::operation, &findPriorityZone);
|
||||||
|
if (findPriorityZone.isInPriorityZone) {
|
||||||
|
// Tag avatar as hero ...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AvatarMixerClientData::processSetTraitsMessage(ReceivedMessage& message,
|
void AvatarMixerClientData::processSetTraitsMessage(ReceivedMessage& message,
|
||||||
|
|
|
@ -45,7 +45,7 @@ public:
|
||||||
using HRCTime = p_high_resolution_clock::time_point;
|
using HRCTime = p_high_resolution_clock::time_point;
|
||||||
using PerNodeTraitVersions = std::unordered_map<Node::LocalID, AvatarTraits::TraitVersions>;
|
using PerNodeTraitVersions = std::unordered_map<Node::LocalID, AvatarTraits::TraitVersions>;
|
||||||
|
|
||||||
int parseData(ReceivedMessage& message) override;
|
int parseData(ReceivedMessage& message, const SlaveSharedData& SlaveSharedData);
|
||||||
AvatarData& getAvatar() { return *_avatar; }
|
AvatarData& getAvatar() { return *_avatar; }
|
||||||
const AvatarData& getAvatar() const { return *_avatar; }
|
const AvatarData& getAvatar() const { return *_avatar; }
|
||||||
const AvatarData* getConstAvatarData() const { return _avatar.get(); }
|
const AvatarData* getConstAvatarData() const { return _avatar.get(); }
|
||||||
|
|
|
@ -90,9 +90,13 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class EntityTree;
|
||||||
|
using EntityTreePointer = std::shared_ptr<EntityTree>;
|
||||||
|
|
||||||
struct SlaveSharedData {
|
struct SlaveSharedData {
|
||||||
QStringList skeletonURLWhitelist;
|
QStringList skeletonURLWhitelist;
|
||||||
QUrl skeletonReplacementURL;
|
QUrl skeletonReplacementURL;
|
||||||
|
EntityTreePointer entityTree;
|
||||||
};
|
};
|
||||||
|
|
||||||
class AvatarMixerSlave {
|
class AvatarMixerSlave {
|
||||||
|
|
|
@ -1203,7 +1203,8 @@ void OctreeServer::beginRunning() {
|
||||||
auto nodeList = DependencyManager::get<NodeList>();
|
auto nodeList = DependencyManager::get<NodeList>();
|
||||||
|
|
||||||
// we need to ask the DS about agents so we can ping/reply with them
|
// we need to ask the DS about agents so we can ping/reply with them
|
||||||
nodeList->addSetOfNodeTypesToNodeInterestSet({ NodeType::Agent, NodeType::EntityScriptServer });
|
nodeList->addSetOfNodeTypesToNodeInterestSet({ NodeType::Agent, NodeType::EntityScriptServer,
|
||||||
|
NodeType::AvatarMixer });
|
||||||
|
|
||||||
beforeRun(); // after payload has been processed
|
beforeRun(); // after payload has been processed
|
||||||
|
|
||||||
|
|
|
@ -41,6 +41,7 @@
|
||||||
#include "EntitySimulation.h"
|
#include "EntitySimulation.h"
|
||||||
#include "EntityDynamicFactoryInterface.h"
|
#include "EntityDynamicFactoryInterface.h"
|
||||||
|
|
||||||
|
//#define WANT_DEBUG
|
||||||
|
|
||||||
Q_DECLARE_METATYPE(EntityItemPointer);
|
Q_DECLARE_METATYPE(EntityItemPointer);
|
||||||
int entityItemPointernMetaTypeId = qRegisterMetaType<EntityItemPointer>();
|
int entityItemPointernMetaTypeId = qRegisterMetaType<EntityItemPointer>();
|
||||||
|
@ -499,6 +500,7 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef WANT_DEBUG
|
#ifdef WANT_DEBUG
|
||||||
|
{
|
||||||
quint64 lastEdited = getLastEdited();
|
quint64 lastEdited = getLastEdited();
|
||||||
float editedAgo = getEditedAgo();
|
float editedAgo = getEditedAgo();
|
||||||
QString agoAsString = formatSecondsElapsed(editedAgo);
|
QString agoAsString = formatSecondsElapsed(editedAgo);
|
||||||
|
@ -512,6 +514,7 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef
|
||||||
qCDebug(entities) << " age=" << getAge() << "seconds - " << ageAsString;
|
qCDebug(entities) << " age=" << getAge() << "seconds - " << ageAsString;
|
||||||
qCDebug(entities) << " lastEdited =" << lastEdited;
|
qCDebug(entities) << " lastEdited =" << lastEdited;
|
||||||
qCDebug(entities) << " ago=" << editedAgo << "seconds - " << agoAsString;
|
qCDebug(entities) << " ago=" << editedAgo << "seconds - " << agoAsString;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
quint64 lastEditedFromBuffer = 0;
|
quint64 lastEditedFromBuffer = 0;
|
||||||
|
@ -1096,7 +1099,7 @@ void EntityItem::simulate(const quint64& now) {
|
||||||
qCDebug(entities) << " hasGravity=" << hasGravity();
|
qCDebug(entities) << " hasGravity=" << hasGravity();
|
||||||
qCDebug(entities) << " hasAcceleration=" << hasAcceleration();
|
qCDebug(entities) << " hasAcceleration=" << hasAcceleration();
|
||||||
qCDebug(entities) << " hasAngularVelocity=" << hasAngularVelocity();
|
qCDebug(entities) << " hasAngularVelocity=" << hasAngularVelocity();
|
||||||
qCDebug(entities) << " getAngularVelocity=" << getAngularVelocity();
|
qCDebug(entities) << " getAngularVelocity=" << getLocalAngularVelocity();
|
||||||
qCDebug(entities) << " isMortal=" << isMortal();
|
qCDebug(entities) << " isMortal=" << isMortal();
|
||||||
qCDebug(entities) << " getAge()=" << getAge();
|
qCDebug(entities) << " getAge()=" << getAge();
|
||||||
qCDebug(entities) << " getLifetime()=" << getLifetime();
|
qCDebug(entities) << " getLifetime()=" << getLifetime();
|
||||||
|
@ -1108,12 +1111,12 @@ void EntityItem::simulate(const quint64& now) {
|
||||||
qCDebug(entities) << " hasGravity=" << hasGravity();
|
qCDebug(entities) << " hasGravity=" << hasGravity();
|
||||||
qCDebug(entities) << " hasAcceleration=" << hasAcceleration();
|
qCDebug(entities) << " hasAcceleration=" << hasAcceleration();
|
||||||
qCDebug(entities) << " hasAngularVelocity=" << hasAngularVelocity();
|
qCDebug(entities) << " hasAngularVelocity=" << hasAngularVelocity();
|
||||||
qCDebug(entities) << " getAngularVelocity=" << getAngularVelocity();
|
qCDebug(entities) << " getAngularVelocity=" << getLocalAngularVelocity();
|
||||||
}
|
}
|
||||||
if (hasAngularVelocity()) {
|
if (hasAngularVelocity()) {
|
||||||
qCDebug(entities) << " CHANGING...=";
|
qCDebug(entities) << " CHANGING...=";
|
||||||
qCDebug(entities) << " hasAngularVelocity=" << hasAngularVelocity();
|
qCDebug(entities) << " hasAngularVelocity=" << hasAngularVelocity();
|
||||||
qCDebug(entities) << " getAngularVelocity=" << getAngularVelocity();
|
qCDebug(entities) << " getAngularVelocity=" << getLocalAngularVelocity();
|
||||||
}
|
}
|
||||||
if (isMortal()) {
|
if (isMortal()) {
|
||||||
qCDebug(entities) << " MORTAL...=";
|
qCDebug(entities) << " MORTAL...=";
|
||||||
|
@ -2649,13 +2652,13 @@ bool EntityItem::matchesJSONFilters(const QJsonObject& jsonFilters) const {
|
||||||
// ALL entity properties. Some work will need to be done to the property system so that it can be more flexible
|
// ALL entity properties. Some work will need to be done to the property system so that it can be more flexible
|
||||||
// (to grab the value and default value of a property given the string representation of that property, for example)
|
// (to grab the value and default value of a property given the string representation of that property, for example)
|
||||||
|
|
||||||
// currently the only property filter we handle is '+' for serverScripts
|
// currently the only property filter we handle in EntityItem is '+' for serverScripts
|
||||||
// which means that we only handle a filtered query asking for entities where the serverScripts property is non-default
|
// which means that we only handle a filtered query asking for entities where the serverScripts property is non-default
|
||||||
|
|
||||||
static const QString SERVER_SCRIPTS_PROPERTY = "serverScripts";
|
static const QString SERVER_SCRIPTS_PROPERTY = "serverScripts";
|
||||||
|
|
||||||
foreach(const auto& property, jsonFilters.keys()) {
|
foreach(const auto& property, jsonFilters.keys()) {
|
||||||
if (property == SERVER_SCRIPTS_PROPERTY && jsonFilters[property] == EntityQueryFilterSymbol::NonDefault) {
|
if (property == SERVER_SCRIPTS_PROPERTY && jsonFilters[property] == EntityQueryFilterSymbol::NonDefault) {
|
||||||
// check if this entity has a non-default value for serverScripts
|
// check if this entity has a non-default value for serverScripts
|
||||||
if (_serverScripts != ENTITY_ITEM_DEFAULT_SERVER_SCRIPTS) {
|
if (_serverScripts != ENTITY_ITEM_DEFAULT_SERVER_SCRIPTS) {
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -516,7 +516,7 @@ public:
|
||||||
QUuid getLastEditedBy() const { return _lastEditedBy; }
|
QUuid getLastEditedBy() const { return _lastEditedBy; }
|
||||||
void setLastEditedBy(QUuid value) { _lastEditedBy = value; }
|
void setLastEditedBy(QUuid value) { _lastEditedBy = value; }
|
||||||
|
|
||||||
bool matchesJSONFilters(const QJsonObject& jsonFilters) const;
|
virtual bool matchesJSONFilters(const QJsonObject& jsonFilters) const;
|
||||||
|
|
||||||
virtual bool getMeshes(MeshProxyList& result) { return true; }
|
virtual bool getMeshes(MeshProxyList& result) { return true; }
|
||||||
|
|
||||||
|
|
|
@ -3178,13 +3178,13 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy
|
||||||
APPEND_ENTITY_PROPERTY(PROP_FLYING_ALLOWED, properties.getFlyingAllowed());
|
APPEND_ENTITY_PROPERTY(PROP_FLYING_ALLOWED, properties.getFlyingAllowed());
|
||||||
APPEND_ENTITY_PROPERTY(PROP_GHOSTING_ALLOWED, properties.getGhostingAllowed());
|
APPEND_ENTITY_PROPERTY(PROP_GHOSTING_ALLOWED, properties.getGhostingAllowed());
|
||||||
APPEND_ENTITY_PROPERTY(PROP_FILTER_URL, properties.getFilterURL());
|
APPEND_ENTITY_PROPERTY(PROP_FILTER_URL, properties.getFilterURL());
|
||||||
APPEND_ENTITY_PROPERTY(PROP_AVATAR_PRIORITY, properties.getAvatarPriority());
|
|
||||||
|
|
||||||
APPEND_ENTITY_PROPERTY(PROP_KEY_LIGHT_MODE, (uint32_t)properties.getKeyLightMode());
|
APPEND_ENTITY_PROPERTY(PROP_KEY_LIGHT_MODE, (uint32_t)properties.getKeyLightMode());
|
||||||
APPEND_ENTITY_PROPERTY(PROP_AMBIENT_LIGHT_MODE, (uint32_t)properties.getAmbientLightMode());
|
APPEND_ENTITY_PROPERTY(PROP_AMBIENT_LIGHT_MODE, (uint32_t)properties.getAmbientLightMode());
|
||||||
APPEND_ENTITY_PROPERTY(PROP_SKYBOX_MODE, (uint32_t)properties.getSkyboxMode());
|
APPEND_ENTITY_PROPERTY(PROP_SKYBOX_MODE, (uint32_t)properties.getSkyboxMode());
|
||||||
APPEND_ENTITY_PROPERTY(PROP_HAZE_MODE, (uint32_t)properties.getHazeMode());
|
APPEND_ENTITY_PROPERTY(PROP_HAZE_MODE, (uint32_t)properties.getHazeMode());
|
||||||
APPEND_ENTITY_PROPERTY(PROP_BLOOM_MODE, (uint32_t)properties.getBloomMode());
|
APPEND_ENTITY_PROPERTY(PROP_BLOOM_MODE, (uint32_t)properties.getBloomMode());
|
||||||
|
APPEND_ENTITY_PROPERTY(PROP_AVATAR_PRIORITY, properties.getAvatarPriority());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (properties.getType() == EntityTypes::PolyVox) {
|
if (properties.getType() == EntityTypes::PolyVox) {
|
||||||
|
|
|
@ -112,13 +112,13 @@ bool ZoneEntityItem::setSubClassProperties(const EntityItemProperties& propertie
|
||||||
SET_ENTITY_PROPERTY_FROM_PROPERTIES(flyingAllowed, setFlyingAllowed);
|
SET_ENTITY_PROPERTY_FROM_PROPERTIES(flyingAllowed, setFlyingAllowed);
|
||||||
SET_ENTITY_PROPERTY_FROM_PROPERTIES(ghostingAllowed, setGhostingAllowed);
|
SET_ENTITY_PROPERTY_FROM_PROPERTIES(ghostingAllowed, setGhostingAllowed);
|
||||||
SET_ENTITY_PROPERTY_FROM_PROPERTIES(filterURL, setFilterURL);
|
SET_ENTITY_PROPERTY_FROM_PROPERTIES(filterURL, setFilterURL);
|
||||||
SET_ENTITY_PROPERTY_FROM_PROPERTIES(avatarPriority, setAvatarPriority);
|
|
||||||
|
|
||||||
SET_ENTITY_PROPERTY_FROM_PROPERTIES(keyLightMode, setKeyLightMode);
|
SET_ENTITY_PROPERTY_FROM_PROPERTIES(keyLightMode, setKeyLightMode);
|
||||||
SET_ENTITY_PROPERTY_FROM_PROPERTIES(ambientLightMode, setAmbientLightMode);
|
SET_ENTITY_PROPERTY_FROM_PROPERTIES(ambientLightMode, setAmbientLightMode);
|
||||||
SET_ENTITY_PROPERTY_FROM_PROPERTIES(skyboxMode, setSkyboxMode);
|
SET_ENTITY_PROPERTY_FROM_PROPERTIES(skyboxMode, setSkyboxMode);
|
||||||
SET_ENTITY_PROPERTY_FROM_PROPERTIES(hazeMode, setHazeMode);
|
SET_ENTITY_PROPERTY_FROM_PROPERTIES(hazeMode, setHazeMode);
|
||||||
SET_ENTITY_PROPERTY_FROM_PROPERTIES(bloomMode, setBloomMode);
|
SET_ENTITY_PROPERTY_FROM_PROPERTIES(bloomMode, setBloomMode);
|
||||||
|
SET_ENTITY_PROPERTY_FROM_PROPERTIES(avatarPriority, setAvatarPriority);
|
||||||
|
|
||||||
somethingChanged = somethingChanged || _keyLightPropertiesChanged || _ambientLightPropertiesChanged ||
|
somethingChanged = somethingChanged || _keyLightPropertiesChanged || _ambientLightPropertiesChanged ||
|
||||||
_stagePropertiesChanged || _skyboxPropertiesChanged || _hazePropertiesChanged || _bloomPropertiesChanged;
|
_stagePropertiesChanged || _skyboxPropertiesChanged || _hazePropertiesChanged || _bloomPropertiesChanged;
|
||||||
|
@ -188,13 +188,13 @@ int ZoneEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data,
|
||||||
READ_ENTITY_PROPERTY(PROP_FLYING_ALLOWED, bool, setFlyingAllowed);
|
READ_ENTITY_PROPERTY(PROP_FLYING_ALLOWED, bool, setFlyingAllowed);
|
||||||
READ_ENTITY_PROPERTY(PROP_GHOSTING_ALLOWED, bool, setGhostingAllowed);
|
READ_ENTITY_PROPERTY(PROP_GHOSTING_ALLOWED, bool, setGhostingAllowed);
|
||||||
READ_ENTITY_PROPERTY(PROP_FILTER_URL, QString, setFilterURL);
|
READ_ENTITY_PROPERTY(PROP_FILTER_URL, QString, setFilterURL);
|
||||||
READ_ENTITY_PROPERTY(PROP_AVATAR_PRIORITY, bool, setAvatarPriority);
|
|
||||||
|
|
||||||
READ_ENTITY_PROPERTY(PROP_KEY_LIGHT_MODE, uint32_t, setKeyLightMode);
|
READ_ENTITY_PROPERTY(PROP_KEY_LIGHT_MODE, uint32_t, setKeyLightMode);
|
||||||
READ_ENTITY_PROPERTY(PROP_AMBIENT_LIGHT_MODE, uint32_t, setAmbientLightMode);
|
READ_ENTITY_PROPERTY(PROP_AMBIENT_LIGHT_MODE, uint32_t, setAmbientLightMode);
|
||||||
READ_ENTITY_PROPERTY(PROP_SKYBOX_MODE, uint32_t, setSkyboxMode);
|
READ_ENTITY_PROPERTY(PROP_SKYBOX_MODE, uint32_t, setSkyboxMode);
|
||||||
READ_ENTITY_PROPERTY(PROP_HAZE_MODE, uint32_t, setHazeMode);
|
READ_ENTITY_PROPERTY(PROP_HAZE_MODE, uint32_t, setHazeMode);
|
||||||
READ_ENTITY_PROPERTY(PROP_BLOOM_MODE, uint32_t, setBloomMode);
|
READ_ENTITY_PROPERTY(PROP_BLOOM_MODE, uint32_t, setBloomMode);
|
||||||
|
READ_ENTITY_PROPERTY(PROP_AVATAR_PRIORITY, bool, setAvatarPriority);
|
||||||
|
|
||||||
return bytesRead;
|
return bytesRead;
|
||||||
}
|
}
|
||||||
|
@ -254,13 +254,13 @@ void ZoneEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBits
|
||||||
APPEND_ENTITY_PROPERTY(PROP_FLYING_ALLOWED, getFlyingAllowed());
|
APPEND_ENTITY_PROPERTY(PROP_FLYING_ALLOWED, getFlyingAllowed());
|
||||||
APPEND_ENTITY_PROPERTY(PROP_GHOSTING_ALLOWED, getGhostingAllowed());
|
APPEND_ENTITY_PROPERTY(PROP_GHOSTING_ALLOWED, getGhostingAllowed());
|
||||||
APPEND_ENTITY_PROPERTY(PROP_FILTER_URL, getFilterURL());
|
APPEND_ENTITY_PROPERTY(PROP_FILTER_URL, getFilterURL());
|
||||||
APPEND_ENTITY_PROPERTY(PROP_AVATAR_PRIORITY, getAvatarPriority());
|
|
||||||
|
|
||||||
APPEND_ENTITY_PROPERTY(PROP_KEY_LIGHT_MODE, (uint32_t)getKeyLightMode());
|
APPEND_ENTITY_PROPERTY(PROP_KEY_LIGHT_MODE, (uint32_t)getKeyLightMode());
|
||||||
APPEND_ENTITY_PROPERTY(PROP_AMBIENT_LIGHT_MODE, (uint32_t)getAmbientLightMode());
|
APPEND_ENTITY_PROPERTY(PROP_AMBIENT_LIGHT_MODE, (uint32_t)getAmbientLightMode());
|
||||||
APPEND_ENTITY_PROPERTY(PROP_SKYBOX_MODE, (uint32_t)getSkyboxMode());
|
APPEND_ENTITY_PROPERTY(PROP_SKYBOX_MODE, (uint32_t)getSkyboxMode());
|
||||||
APPEND_ENTITY_PROPERTY(PROP_HAZE_MODE, (uint32_t)getHazeMode());
|
APPEND_ENTITY_PROPERTY(PROP_HAZE_MODE, (uint32_t)getHazeMode());
|
||||||
APPEND_ENTITY_PROPERTY(PROP_BLOOM_MODE, (uint32_t)getBloomMode());
|
APPEND_ENTITY_PROPERTY(PROP_BLOOM_MODE, (uint32_t)getBloomMode());
|
||||||
|
APPEND_ENTITY_PROPERTY(PROP_AVATAR_PRIORITY, getAvatarPriority());
|
||||||
}
|
}
|
||||||
|
|
||||||
void ZoneEntityItem::debugDump() const {
|
void ZoneEntityItem::debugDump() const {
|
||||||
|
@ -274,6 +274,7 @@ void ZoneEntityItem::debugDump() const {
|
||||||
qCDebug(entities) << " _ambientLightMode:" << EntityItemProperties::getComponentModeAsString(_ambientLightMode);
|
qCDebug(entities) << " _ambientLightMode:" << EntityItemProperties::getComponentModeAsString(_ambientLightMode);
|
||||||
qCDebug(entities) << " _skyboxMode:" << EntityItemProperties::getComponentModeAsString(_skyboxMode);
|
qCDebug(entities) << " _skyboxMode:" << EntityItemProperties::getComponentModeAsString(_skyboxMode);
|
||||||
qCDebug(entities) << " _bloomMode:" << EntityItemProperties::getComponentModeAsString(_bloomMode);
|
qCDebug(entities) << " _bloomMode:" << EntityItemProperties::getComponentModeAsString(_bloomMode);
|
||||||
|
qCDebug(entities) << " _avatarPriority:" << getAvatarPriority();
|
||||||
|
|
||||||
_keyLightProperties.debugDump();
|
_keyLightProperties.debugDump();
|
||||||
_ambientLightProperties.debugDump();
|
_ambientLightProperties.debugDump();
|
||||||
|
@ -469,3 +470,16 @@ void ZoneEntityItem::fetchCollisionGeometryResource() {
|
||||||
_shapeResource = DependencyManager::get<ModelCache>()->getCollisionGeometryResource(hullURL);
|
_shapeResource = DependencyManager::get<ModelCache>()->getCollisionGeometryResource(hullURL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ZoneEntityItem::matchesJSONFilters(const QJsonObject& jsonFilters) const {
|
||||||
|
// currently the only property filter we handle in ZoneEntityItem is value of avatarPriority
|
||||||
|
|
||||||
|
static const QString AVATAR_PRIORITY_PROPERTY = "avatarPriority";
|
||||||
|
|
||||||
|
if (jsonFilters.contains(AVATAR_PRIORITY_PROPERTY)) {
|
||||||
|
return (jsonFilters[AVATAR_PRIORITY_PROPERTY].toBool() == _avatarPriority);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Chain to base:
|
||||||
|
return EntityItem::matchesJSONFilters(jsonFilters);
|
||||||
|
}
|
||||||
|
|
|
@ -66,6 +66,8 @@ public:
|
||||||
QString getCompoundShapeURL() const;
|
QString getCompoundShapeURL() const;
|
||||||
virtual void setCompoundShapeURL(const QString& url);
|
virtual void setCompoundShapeURL(const QString& url);
|
||||||
|
|
||||||
|
virtual bool matchesJSONFilters(const QJsonObject& jsonFilters) const override;
|
||||||
|
|
||||||
KeyLightPropertyGroup getKeyLightProperties() const { return resultWithReadLock<KeyLightPropertyGroup>([&] { return _keyLightProperties; }); }
|
KeyLightPropertyGroup getKeyLightProperties() const { return resultWithReadLock<KeyLightPropertyGroup>([&] { return _keyLightProperties; }); }
|
||||||
AmbientLightPropertyGroup getAmbientLightProperties() const { return resultWithReadLock<AmbientLightPropertyGroup>([&] { return _ambientLightProperties; }); }
|
AmbientLightPropertyGroup getAmbientLightProperties() const { return resultWithReadLock<AmbientLightPropertyGroup>([&] { return _ambientLightProperties; }); }
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue