Optimize network transform replication
This commit is contained in:
@@ -157,6 +157,7 @@ void NetworkTransform::Serialize(NetworkStream* stream)
|
||||
|
||||
// Encode data
|
||||
Data data;
|
||||
Platform::MemoryClear(&data, sizeof(data));
|
||||
data.LocalSpace = LocalSpace;
|
||||
data.HasSequenceIndex = Mode == ReplicationModes::Prediction;
|
||||
data.Components = Components;
|
||||
@@ -195,8 +196,7 @@ void NetworkTransform::Serialize(NetworkStream* stream)
|
||||
}
|
||||
if (EnumHasAllFlags(data.Components, ReplicationComponents::Rotation))
|
||||
{
|
||||
const Float3 rotation = transform.Orientation.GetEuler();
|
||||
stream->Write(rotation);
|
||||
stream->Write(transform.Orientation);
|
||||
}
|
||||
else if (EnumHasAnyFlags(data.Components, ReplicationComponents::Rotation))
|
||||
{
|
||||
@@ -260,9 +260,7 @@ void NetworkTransform::Deserialize(NetworkStream* stream)
|
||||
}
|
||||
if (EnumHasAllFlags(data.Components, ReplicationComponents::Rotation))
|
||||
{
|
||||
Float3 rotation;
|
||||
stream->Read(rotation);
|
||||
transform.Orientation = Quaternion::Euler(rotation);
|
||||
stream->Read(transform.Orientation);
|
||||
}
|
||||
else if (EnumHasAnyFlags(data.Components, ReplicationComponents::Rotation))
|
||||
{
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
#include "NetworkStream.h"
|
||||
#include "INetworkSerializable.h"
|
||||
#include "Engine/Core/Math/Quaternion.h"
|
||||
#include "Engine/Core/Math/Transform.h"
|
||||
|
||||
// Quaternion quantized for optimized network data size.
|
||||
struct NetworkQuaternion
|
||||
@@ -151,6 +152,20 @@ void NetworkStream::Read(Quaternion& data)
|
||||
NetworkQuaternion::Read(this, data);
|
||||
}
|
||||
|
||||
void NetworkStream::Read(Transform& data)
|
||||
{
|
||||
struct NonQuantized
|
||||
{
|
||||
Vector3 Pos;
|
||||
Float3 Scale;
|
||||
};
|
||||
NonQuantized nonQuantized;
|
||||
ReadBytes(&nonQuantized, sizeof(nonQuantized));
|
||||
NetworkQuaternion::Read(this, data.Orientation);
|
||||
data.Translation = nonQuantized.Pos;
|
||||
data.Scale = nonQuantized.Scale;
|
||||
}
|
||||
|
||||
void NetworkStream::Write(INetworkSerializable& obj)
|
||||
{
|
||||
obj.Serialize(this);
|
||||
@@ -166,6 +181,19 @@ void NetworkStream::Write(const Quaternion& data)
|
||||
NetworkQuaternion::Write(this, data);
|
||||
}
|
||||
|
||||
void NetworkStream::Write(const Transform& data)
|
||||
{
|
||||
struct NonQuantized
|
||||
{
|
||||
Vector3 Pos;
|
||||
Float3 Scale;
|
||||
};
|
||||
// TODO: quantize transform (at least scale)
|
||||
NonQuantized nonQuantized = { data.Translation, data.Scale };
|
||||
WriteBytes(&nonQuantized, sizeof(nonQuantized));
|
||||
NetworkQuaternion::Write(this, data.Orientation);
|
||||
}
|
||||
|
||||
void NetworkStream::Flush()
|
||||
{
|
||||
// Nothing to do
|
||||
|
||||
@@ -73,11 +73,13 @@ public:
|
||||
void Read(INetworkSerializable& obj);
|
||||
void Read(INetworkSerializable* obj);
|
||||
void Read(Quaternion& data);
|
||||
void Read(Transform& data);
|
||||
|
||||
using WriteStream::Write;
|
||||
void Write(INetworkSerializable& obj);
|
||||
void Write(INetworkSerializable* obj);
|
||||
void Write(const Quaternion& data);
|
||||
void Write(const Transform& data);
|
||||
|
||||
public:
|
||||
// [Stream]
|
||||
|
||||
Reference in New Issue
Block a user