mirror of
https://github.com/overte-org/overte.git
synced 2025-08-11 06:22:10 +02:00
fix SafeLanding start/stop on entity-server connection flow
This commit is contained in:
parent
dfb7ac7044
commit
bf068a3211
6 changed files with 71 additions and 48 deletions
|
@ -6201,7 +6201,9 @@ void Application::update(float deltaTime) {
|
||||||
if (isServerlessMode()) {
|
if (isServerlessMode()) {
|
||||||
tryToEnablePhysics();
|
tryToEnablePhysics();
|
||||||
} else if (_failedToConnectToEntityServer) {
|
} else if (_failedToConnectToEntityServer) {
|
||||||
_octreeProcessor.stopSafeLanding();
|
if (_octreeProcessor.safeLandingIsActive()) {
|
||||||
|
_octreeProcessor.stopSafeLanding();
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
_octreeProcessor.updateSafeLanding();
|
_octreeProcessor.updateSafeLanding();
|
||||||
if (_octreeProcessor.safeLandingIsComplete()) {
|
if (_octreeProcessor.safeLandingIsComplete()) {
|
||||||
|
@ -7154,13 +7156,17 @@ void Application::resettingDomain() {
|
||||||
clearDomainOctreeDetails(false);
|
clearDomainOctreeDetails(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::nodeAdded(SharedNodePointer node) const {
|
void Application::nodeAdded(SharedNodePointer node) {
|
||||||
if (node->getType() == NodeType::EntityServer) {
|
if (node->getType() == NodeType::EntityServer) {
|
||||||
if (!_failedToConnectToEntityServer) {
|
if (_failedToConnectToEntityServer && !_entityServerConnectionTimer.isActive()) {
|
||||||
|
_failedToConnectToEntityServer = false;
|
||||||
|
_octreeProcessor.stopSafeLanding();
|
||||||
|
_octreeProcessor.startSafeLanding();
|
||||||
|
} else if (_entityServerConnectionTimer.isActive()) {
|
||||||
_entityServerConnectionTimer.stop();
|
_entityServerConnectionTimer.stop();
|
||||||
_entityServerConnectionTimer.setInterval(ENTITY_SERVER_CONNECTION_TIMEOUT);
|
|
||||||
_entityServerConnectionTimer.start();
|
|
||||||
}
|
}
|
||||||
|
_entityServerConnectionTimer.setInterval(ENTITY_SERVER_CONNECTION_TIMEOUT);
|
||||||
|
_entityServerConnectionTimer.start();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7170,7 +7176,6 @@ void Application::nodeActivated(SharedNodePointer node) {
|
||||||
|
|
||||||
#if !defined(DISABLE_QML)
|
#if !defined(DISABLE_QML)
|
||||||
auto offscreenUi = getOffscreenUI();
|
auto offscreenUi = getOffscreenUI();
|
||||||
|
|
||||||
if (offscreenUi) {
|
if (offscreenUi) {
|
||||||
auto nodeList = DependencyManager::get<NodeList>();
|
auto nodeList = DependencyManager::get<NodeList>();
|
||||||
|
|
||||||
|
|
|
@ -527,7 +527,7 @@ private slots:
|
||||||
|
|
||||||
void domainURLChanged(QUrl domainURL);
|
void domainURLChanged(QUrl domainURL);
|
||||||
void updateWindowTitle() const;
|
void updateWindowTitle() const;
|
||||||
void nodeAdded(SharedNodePointer node) const;
|
void nodeAdded(SharedNodePointer node);
|
||||||
void nodeActivated(SharedNodePointer node);
|
void nodeActivated(SharedNodePointer node);
|
||||||
void nodeKilled(SharedNodePointer node);
|
void nodeKilled(SharedNodePointer node);
|
||||||
static void packetSent(quint64 length);
|
static void packetSent(quint64 length);
|
||||||
|
|
|
@ -63,7 +63,6 @@ void OctreePacketProcessor::processPacket(QSharedPointer<ReceivedMessage> messag
|
||||||
// construct a new packet from the piggybacked one
|
// construct a new packet from the piggybacked one
|
||||||
auto buffer = std::unique_ptr<char[]>(new char[piggybackBytes]);
|
auto buffer = std::unique_ptr<char[]>(new char[piggybackBytes]);
|
||||||
memcpy(buffer.get(), message->getRawMessage() + statsMessageLength, piggybackBytes);
|
memcpy(buffer.get(), message->getRawMessage() + statsMessageLength, piggybackBytes);
|
||||||
|
|
||||||
auto newPacket = NLPacket::fromReceivedPacket(std::move(buffer), piggybackBytes, message->getSenderSockAddr());
|
auto newPacket = NLPacket::fromReceivedPacket(std::move(buffer), piggybackBytes, message->getSenderSockAddr());
|
||||||
message = QSharedPointer<ReceivedMessage>::create(*newPacket);
|
message = QSharedPointer<ReceivedMessage>::create(*newPacket);
|
||||||
} else {
|
} else {
|
||||||
|
@ -80,7 +79,6 @@ void OctreePacketProcessor::processPacket(QSharedPointer<ReceivedMessage> messag
|
||||||
|
|
||||||
const QUuid& senderUUID = sendingNode->getUUID();
|
const QUuid& senderUUID = sendingNode->getUUID();
|
||||||
if (!versionDebugSuppressMap.contains(senderUUID, packetType)) {
|
if (!versionDebugSuppressMap.contains(senderUUID, packetType)) {
|
||||||
|
|
||||||
qDebug() << "Was stats packet? " << wasStatsPacket;
|
qDebug() << "Was stats packet? " << wasStatsPacket;
|
||||||
qDebug() << "OctreePacketProcessor - piggyback packet version mismatch on" << packetType << "- Sender"
|
qDebug() << "OctreePacketProcessor - piggyback packet version mismatch on" << packetType << "- Sender"
|
||||||
<< senderUUID << "sent" << (int) message->getVersion() << "but"
|
<< senderUUID << "sent" << (int) message->getVersion() << "but"
|
||||||
|
@ -113,7 +111,7 @@ void OctreePacketProcessor::processPacket(QSharedPointer<ReceivedMessage> messag
|
||||||
case PacketType::EntityData: {
|
case PacketType::EntityData: {
|
||||||
if (DependencyManager::get<SceneScriptingInterface>()->shouldRenderEntities()) {
|
if (DependencyManager::get<SceneScriptingInterface>()->shouldRenderEntities()) {
|
||||||
auto renderer = qApp->getEntities();
|
auto renderer = qApp->getEntities();
|
||||||
if (renderer) {
|
if (renderer && _safeLanding) {
|
||||||
renderer->processDatagram(*message, sendingNode);
|
renderer->processDatagram(*message, sendingNode);
|
||||||
_safeLanding->addToSequence(renderer->getLastOctreeMessageSequence());
|
_safeLanding->addToSequence(renderer->getLastOctreeMessageSequence());
|
||||||
}
|
}
|
||||||
|
@ -124,7 +122,9 @@ void OctreePacketProcessor::processPacket(QSharedPointer<ReceivedMessage> messag
|
||||||
// Read sequence #
|
// Read sequence #
|
||||||
OCTREE_PACKET_SEQUENCE completionNumber;
|
OCTREE_PACKET_SEQUENCE completionNumber;
|
||||||
message->readPrimitive(&completionNumber);
|
message->readPrimitive(&completionNumber);
|
||||||
_safeLanding->finishSequence(0, completionNumber);
|
if (_safeLanding) {
|
||||||
|
_safeLanding->finishSequence(0, completionNumber);
|
||||||
|
}
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
default: {
|
default: {
|
||||||
|
@ -134,17 +134,30 @@ void OctreePacketProcessor::processPacket(QSharedPointer<ReceivedMessage> messag
|
||||||
}
|
}
|
||||||
|
|
||||||
void OctreePacketProcessor::startSafeLanding() {
|
void OctreePacketProcessor::startSafeLanding() {
|
||||||
_safeLanding->startTracking(qApp->getEntities());
|
if (_safeLanding) {
|
||||||
|
_safeLanding->startTracking(qApp->getEntities());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void OctreePacketProcessor::updateSafeLanding() {
|
void OctreePacketProcessor::updateSafeLanding() {
|
||||||
_safeLanding->updateTracking();
|
if (_safeLanding) {
|
||||||
|
_safeLanding->updateTracking();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void OctreePacketProcessor::stopSafeLanding() {
|
void OctreePacketProcessor::stopSafeLanding() {
|
||||||
_safeLanding->stopTracking();
|
if (_safeLanding) {
|
||||||
|
_safeLanding->stopTracking();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool OctreePacketProcessor::safeLandingIsActive() const {
|
||||||
|
return _safeLanding && _safeLanding->isTracking();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool OctreePacketProcessor::safeLandingIsComplete() const {
|
bool OctreePacketProcessor::safeLandingIsComplete() const {
|
||||||
return _safeLanding->trackingIsComplete();
|
if (_safeLanding) {
|
||||||
|
return _safeLanding->trackingIsComplete();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,7 @@ public:
|
||||||
void startSafeLanding();
|
void startSafeLanding();
|
||||||
void updateSafeLanding();
|
void updateSafeLanding();
|
||||||
void stopSafeLanding();
|
void stopSafeLanding();
|
||||||
|
bool safeLandingIsActive() const;
|
||||||
bool safeLandingIsComplete() const;
|
bool safeLandingIsComplete() const;
|
||||||
|
|
||||||
float domainLoadingProgress() const { return _safeLanding->loadingProgressPercentage(); }
|
float domainLoadingProgress() const { return _safeLanding->loadingProgressPercentage(); }
|
||||||
|
|
|
@ -100,50 +100,53 @@ void SafeLanding::updateTracking() {
|
||||||
if (!_trackingEntities || !_entityTreeRenderer) {
|
if (!_trackingEntities || !_entityTreeRenderer) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Locker lock(_lock);
|
|
||||||
|
|
||||||
bool enableInterstitial = DependencyManager::get<NodeList>()->getDomainHandler().getInterstitialModeEnabled();
|
{
|
||||||
|
Locker lock(_lock);
|
||||||
auto entityMapIter = _trackedEntities.begin();
|
bool enableInterstitial = DependencyManager::get<NodeList>()->getDomainHandler().getInterstitialModeEnabled();
|
||||||
while (entityMapIter != _trackedEntities.end()) {
|
auto entityMapIter = _trackedEntities.begin();
|
||||||
auto entity = entityMapIter->second;
|
while (entityMapIter != _trackedEntities.end()) {
|
||||||
bool isVisuallyReady = true;
|
auto entity = entityMapIter->second;
|
||||||
|
bool isVisuallyReady = true;
|
||||||
|
if (enableInterstitial) {
|
||||||
|
auto entityRenderable = _entityTreeRenderer->renderableForEntityId(entityMapIter->first);
|
||||||
|
if (!entityRenderable) {
|
||||||
|
_entityTreeRenderer->addingEntity(entityMapIter->first);
|
||||||
|
}
|
||||||
|
isVisuallyReady = entity->isVisuallyReady() || (!entityRenderable && !entity->isParentPathComplete());
|
||||||
|
}
|
||||||
|
if (isEntityPhysicsReady(entity) && isVisuallyReady) {
|
||||||
|
entityMapIter = _trackedEntities.erase(entityMapIter);
|
||||||
|
} else {
|
||||||
|
if (!isVisuallyReady) {
|
||||||
|
entity->requestRenderUpdate();
|
||||||
|
}
|
||||||
|
entityMapIter++;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (enableInterstitial) {
|
if (enableInterstitial) {
|
||||||
auto entityRenderable = _entityTreeRenderer->renderableForEntityId(entityMapIter->first);
|
_trackedEntityStabilityCount++;
|
||||||
if (!entityRenderable) {
|
|
||||||
_entityTreeRenderer->addingEntity(entityMapIter->first);
|
|
||||||
}
|
|
||||||
|
|
||||||
isVisuallyReady = entity->isVisuallyReady() || (!entityRenderable && !entity->isParentPathComplete());
|
|
||||||
}
|
}
|
||||||
if (isEntityPhysicsReady(entity) && isVisuallyReady) {
|
|
||||||
entityMapIter = _trackedEntities.erase(entityMapIter);
|
|
||||||
} else {
|
|
||||||
if (!isVisuallyReady) {
|
|
||||||
entity->requestRenderUpdate();
|
|
||||||
}
|
|
||||||
entityMapIter++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (enableInterstitial) {
|
|
||||||
_trackedEntityStabilityCount++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_trackedEntities.empty()) {
|
if (_trackedEntities.empty()) {
|
||||||
// no more tracked entities --> check sequenceNumbers
|
// no more tracked entities --> check sequenceNumbers
|
||||||
if (_initialStart != INVALID_SEQUENCE) {
|
if (_initialStart != INVALID_SEQUENCE) {
|
||||||
Locker lock(_lock);
|
bool shouldStop = false;
|
||||||
int sequenceSize = _initialStart <= _initialEnd ? _initialEnd - _initialStart:
|
{
|
||||||
_initialEnd + SEQUENCE_MODULO - _initialStart;
|
Locker lock(_lock);
|
||||||
auto startIter = _sequenceNumbers.find(_initialStart);
|
int sequenceSize = _initialStart <= _initialEnd ? _initialEnd - _initialStart:
|
||||||
auto endIter = _sequenceNumbers.find(_initialEnd - 1);
|
_initialEnd + SEQUENCE_MODULO - _initialStart;
|
||||||
|
auto startIter = _sequenceNumbers.find(_initialStart);
|
||||||
|
auto endIter = _sequenceNumbers.find(_initialEnd - 1);
|
||||||
|
|
||||||
bool missingSequenceNumbers = qApp->isMissingSequenceNumbers();
|
bool missingSequenceNumbers = qApp->isMissingSequenceNumbers();
|
||||||
if (sequenceSize == 0 ||
|
shouldStop = (sequenceSize == 0 ||
|
||||||
(startIter != _sequenceNumbers.end() &&
|
(startIter != _sequenceNumbers.end() &&
|
||||||
endIter != _sequenceNumbers.end() &&
|
endIter != _sequenceNumbers.end() &&
|
||||||
((distance(startIter, endIter) == sequenceSize - 1) || !missingSequenceNumbers))) {
|
((distance(startIter, endIter) == sequenceSize - 1) || !missingSequenceNumbers)));
|
||||||
|
}
|
||||||
|
if (shouldStop) {
|
||||||
stopTracking();
|
stopTracking();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,7 @@ public:
|
||||||
void startTracking(QSharedPointer<EntityTreeRenderer> entityTreeRenderer);
|
void startTracking(QSharedPointer<EntityTreeRenderer> entityTreeRenderer);
|
||||||
void updateTracking();
|
void updateTracking();
|
||||||
void stopTracking();
|
void stopTracking();
|
||||||
|
bool isTracking() const { return _trackingEntities; }
|
||||||
bool trackingIsComplete() const;
|
bool trackingIsComplete() const;
|
||||||
|
|
||||||
void finishSequence(int first, int last); // 'last' exclusive.
|
void finishSequence(int first, int last); // 'last' exclusive.
|
||||||
|
|
Loading…
Reference in a new issue