mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 12:08:54 +02:00
some network API reworking in AvatarMixer
This commit is contained in:
parent
76fb120f67
commit
61c4e6d72e
1 changed files with 107 additions and 116 deletions
|
@ -120,10 +120,7 @@ void AvatarMixer::broadcastAvatarData() {
|
||||||
++framesSinceCutoffEvent;
|
++framesSinceCutoffEvent;
|
||||||
}
|
}
|
||||||
|
|
||||||
static QByteArray mixedAvatarByteArray;
|
|
||||||
|
|
||||||
auto nodeList = DependencyManager::get<NodeList>();
|
auto nodeList = DependencyManager::get<NodeList>();
|
||||||
int numPacketHeaderBytes = nodeList->populatePacketHeader(mixedAvatarByteArray, PacketTypeBulkAvatarData);
|
|
||||||
|
|
||||||
// setup for distributed random floating point values
|
// setup for distributed random floating point values
|
||||||
std::random_device randomDevice;
|
std::random_device randomDevice;
|
||||||
|
@ -151,9 +148,6 @@ void AvatarMixer::broadcastAvatarData() {
|
||||||
}
|
}
|
||||||
++_sumListeners;
|
++_sumListeners;
|
||||||
|
|
||||||
// reset packet pointers for this node
|
|
||||||
mixedAvatarByteArray.resize(numPacketHeaderBytes);
|
|
||||||
|
|
||||||
AvatarData& avatar = nodeData->getAvatar();
|
AvatarData& avatar = nodeData->getAvatar();
|
||||||
glm::vec3 myPosition = avatar.getPosition();
|
glm::vec3 myPosition = avatar.getPosition();
|
||||||
|
|
||||||
|
@ -218,6 +212,9 @@ void AvatarMixer::broadcastAvatarData() {
|
||||||
nodeData->incrementNumFramesSinceFRDAdjustment();
|
nodeData->incrementNumFramesSinceFRDAdjustment();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// setup a PacketList for the avatarPackets
|
||||||
|
PacketList avatarPacketList(PacketType::AvatarData);
|
||||||
|
|
||||||
// this is an AGENT we have received head data from
|
// this is an AGENT we have received head data from
|
||||||
// send back a packet with other active node data to this node
|
// send back a packet with other active node data to this node
|
||||||
nodeList->eachMatchingNode(
|
nodeList->eachMatchingNode(
|
||||||
|
@ -257,7 +254,7 @@ void AvatarMixer::broadcastAvatarData() {
|
||||||
}
|
}
|
||||||
|
|
||||||
PacketSequenceNumber lastSeqToReceiver = nodeData->getLastBroadcastSequenceNumber(otherNode->getUUID());
|
PacketSequenceNumber lastSeqToReceiver = nodeData->getLastBroadcastSequenceNumber(otherNode->getUUID());
|
||||||
PacketSequenceNumber lastSeqFromSender = otherNode->getLastSequenceNumberForPacketType(PacketTypeAvatarData);
|
PacketSequenceNumber lastSeqFromSender = otherNode->getLastSequenceNumberForPacketType(PacketType::AvatarData);
|
||||||
|
|
||||||
if (lastSeqToReceiver > lastSeqFromSender) {
|
if (lastSeqToReceiver > lastSeqFromSender) {
|
||||||
// Did we somehow get out of order packets from the sender?
|
// Did we somehow get out of order packets from the sender?
|
||||||
|
@ -286,23 +283,15 @@ void AvatarMixer::broadcastAvatarData() {
|
||||||
|
|
||||||
// set the last sent sequence number for this sender on the receiver
|
// set the last sent sequence number for this sender on the receiver
|
||||||
nodeData->setLastBroadcastSequenceNumber(otherNode->getUUID(),
|
nodeData->setLastBroadcastSequenceNumber(otherNode->getUUID(),
|
||||||
otherNode->getLastSequenceNumberForPacketType(PacketTypeAvatarData));
|
otherNode->getLastSequenceNumberForPacketType(PacketType::AvatarData));
|
||||||
|
|
||||||
QByteArray avatarByteArray;
|
// start a new segment in the PacketList for this avatar
|
||||||
avatarByteArray.append(otherNode->getUUID().toRfc4122());
|
avatarPacketList.startSegment();
|
||||||
avatarByteArray.append(otherAvatar.toByteArray());
|
|
||||||
|
|
||||||
if (avatarByteArray.size() + mixedAvatarByteArray.size() > MAX_PACKET_SIZE) {
|
numAvatarDataBytes += avatarPacketList.write(otherNode->getUUID().toRfc4122());
|
||||||
nodeList->writeDatagram(mixedAvatarByteArray, node);
|
numAvatarDataBytes += avatarPacketList.write(otherAvatar.toByteArray());
|
||||||
|
|
||||||
numAvatarDataBytes += mixedAvatarByteArray.size();
|
avatarPacketList.endSegment();
|
||||||
|
|
||||||
// reset the packet
|
|
||||||
mixedAvatarByteArray.resize(numPacketHeaderBytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
// copy the avatar into the mixedAvatarByteArray packet
|
|
||||||
mixedAvatarByteArray.append(avatarByteArray);
|
|
||||||
|
|
||||||
// if the receiving avatar has just connected make sure we send out the mesh and billboard
|
// if the receiving avatar has just connected make sure we send out the mesh and billboard
|
||||||
// for this avatar (assuming they exist)
|
// for this avatar (assuming they exist)
|
||||||
|
@ -315,11 +304,12 @@ void AvatarMixer::broadcastAvatarData() {
|
||||||
&& (forceSend
|
&& (forceSend
|
||||||
|| otherNodeData->getBillboardChangeTimestamp() > _lastFrameTimestamp
|
|| otherNodeData->getBillboardChangeTimestamp() > _lastFrameTimestamp
|
||||||
|| randFloat() < BILLBOARD_AND_IDENTITY_SEND_PROBABILITY)) {
|
|| randFloat() < BILLBOARD_AND_IDENTITY_SEND_PROBABILITY)) {
|
||||||
QByteArray billboardPacket = nodeList->byteArrayWithPopulatedHeader(PacketTypeAvatarBillboard);
|
|
||||||
billboardPacket.append(otherNode->getUUID().toRfc4122());
|
|
||||||
billboardPacket.append(otherNodeData->getAvatar().getBillboard());
|
|
||||||
|
|
||||||
nodeList->writeDatagram(billboardPacket, node);
|
auto billboardPacket { NLPacket::create(PacketType::AvatarBillboard); }
|
||||||
|
billboardPacket.write(otherNode->getUUID().toRfc4122());
|
||||||
|
billboardPacket.write(otherNodeData->getAvatar().getBillboard());
|
||||||
|
|
||||||
|
nodeList->sendPacket(billboardPacket, node);
|
||||||
|
|
||||||
++_sumBillboardPackets;
|
++_sumBillboardPackets;
|
||||||
}
|
}
|
||||||
|
@ -329,23 +319,24 @@ void AvatarMixer::broadcastAvatarData() {
|
||||||
|| otherNodeData->getIdentityChangeTimestamp() > _lastFrameTimestamp
|
|| otherNodeData->getIdentityChangeTimestamp() > _lastFrameTimestamp
|
||||||
|| randFloat() < BILLBOARD_AND_IDENTITY_SEND_PROBABILITY)) {
|
|| randFloat() < BILLBOARD_AND_IDENTITY_SEND_PROBABILITY)) {
|
||||||
|
|
||||||
QByteArray identityPacket = nodeList->byteArrayWithPopulatedHeader(PacketTypeAvatarIdentity);
|
auto identityPacket { NLPacket::create(PacketType::AvatarIdentity); }
|
||||||
|
|
||||||
QByteArray individualData = otherNodeData->getAvatar().identityByteArray();
|
QByteArray individualData = otherNodeData->getAvatar().identityByteArray();
|
||||||
individualData.replace(0, NUM_BYTES_RFC4122_UUID, otherNode->getUUID().toRfc4122());
|
individualData.replace(0, NUM_BYTES_RFC4122_UUID, otherNode->getUUID().toRfc4122());
|
||||||
identityPacket.append(individualData);
|
|
||||||
|
|
||||||
nodeList->writeDatagram(identityPacket, node);
|
identityPacket.write(individualData);
|
||||||
|
|
||||||
|
nodeList->sendPacket(identityPacket, node);
|
||||||
|
|
||||||
++_sumIdentityPackets;
|
++_sumIdentityPackets;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// send the last packet
|
// send the avatar data PacketList
|
||||||
nodeList->writeDatagram(mixedAvatarByteArray, node);
|
nodeList->sendPacketList(avatarPacketList, node);
|
||||||
|
|
||||||
// record the bytes sent for other avatar data in the AvatarMixerClientData
|
// record the bytes sent for other avatar data in the AvatarMixerClientData
|
||||||
nodeData->recordSentAvatarData(numAvatarDataBytes + mixedAvatarByteArray.size());
|
nodeData->recordSentAvatarData(numAvatarDataBytes);
|
||||||
|
|
||||||
// record the number of avatars held back this frame
|
// record the number of avatars held back this frame
|
||||||
nodeData->recordNumOtherAvatarStarves(numAvatarsHeldBack);
|
nodeData->recordNumOtherAvatarStarves(numAvatarsHeldBack);
|
||||||
|
@ -370,8 +361,8 @@ void AvatarMixer::nodeKilled(SharedNodePointer killedNode) {
|
||||||
|
|
||||||
// this was an avatar we were sending to other people
|
// this was an avatar we were sending to other people
|
||||||
// send a kill packet for it to our other nodes
|
// send a kill packet for it to our other nodes
|
||||||
QByteArray killPacket = nodeList->byteArrayWithPopulatedHeader(PacketTypeKillAvatar);
|
auto killPacket { NLPacket::create(PacketType::KillAvatar); }
|
||||||
killPacket += killedNode->getUUID().toRfc4122();
|
killPacket.write(killedNode->getUUID().toRfc4122());
|
||||||
|
|
||||||
nodeList->broadcastToNodes(killPacket, NodeSet() << NodeType::Agent);
|
nodeList->broadcastToNodes(killPacket, NodeSet() << NodeType::Agent);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue