Add support for Double2/3/4 for Variant

Increase size to 40 bytes to store Double3 without allocations
Change Ray and BoundingBox to be stored inlined in BoundingBox
Use safer accessors to read Variant explicit data type
This commit is contained in:
Wojtek Figat
2022-05-20 18:10:35 +02:00
parent 2369b6a34a
commit ed908a260e
9 changed files with 894 additions and 442 deletions

View File

@@ -162,44 +162,53 @@ void Serialization::Serialize(ISerializable::SerializeStream& stream, const Vari
case VariantType::Vector4:
stream.Vector4(*(Vector4*)v.AsData);
break;
case VariantType::Double2:
stream.Double2(v.AsDouble2());
break;
case VariantType::Double3:
stream.Double3(v.AsDouble3());
break;
case VariantType::Double4:
stream.Double4(v.AsDouble4());
break;
case VariantType::Int2:
stream.Int2(*(Int2*)v.AsData);
stream.Int2(v.AsInt2());
break;
case VariantType::Int3:
stream.Int3(*(Int3*)v.AsData);
stream.Int3(v.AsInt3());
break;
case VariantType::Int4:
stream.Int4(*(Int4*)v.AsData);
stream.Int4(v.AsInt4());
break;
case VariantType::Color:
stream.Color(*(Color*)v.AsData);
stream.Color(v.AsColor());
break;
case VariantType::Guid:
stream.Guid(*(Guid*)v.AsData);
stream.Guid(v.AsGuid());
break;
case VariantType::BoundingSphere:
stream.BoundingSphere(*(BoundingSphere*)v.AsData);
stream.BoundingSphere(v.AsBoundingSphere());
break;
case VariantType::Quaternion:
stream.Quaternion(*(Quaternion*)v.AsData);
stream.Quaternion(v.AsQuaternion());
break;
case VariantType::Rectangle:
stream.Rectangle(*(Rectangle*)v.AsData);
stream.Rectangle(v.AsRectangle());
break;
case VariantType::BoundingBox:
stream.BoundingBox(*(BoundingBox*)v.AsBlob.Data);
stream.BoundingBox(v.AsBoundingBox());
break;
case VariantType::Transform:
stream.Transform(*(Transform*)v.AsBlob.Data);
stream.Transform(v.AsTransform());
break;
case VariantType::Ray:
stream.Ray(*(Ray*)v.AsBlob.Data);
stream.Ray(v.AsRay());
break;
case VariantType::Matrix:
stream.Matrix(*(Matrix*)v.AsBlob.Data);
stream.Matrix(v.AsMatrix());
break;
case VariantType::Array:
Serialize(stream, *(Array<Variant, HeapAllocation>*)v.AsData, nullptr);
Serialize(stream, v.AsArray(), nullptr);
break;
case VariantType::Dictionary:
Serialize(stream, *v.AsDictionary, nullptr);
@@ -304,6 +313,15 @@ void Serialization::Deserialize(ISerializable::DeserializeStream& stream, Varian
case VariantType::Vector4:
Deserialize(value, *(Vector4*)v.AsData, modifier);
break;
case VariantType::Double2:
Deserialize(value, *(Double2*)v.AsData, modifier);
break;
case VariantType::Double3:
Deserialize(value, *(Double3*)v.AsData, modifier);
break;
case VariantType::Double4:
Deserialize(value, *(Double4*)v.AsBlob.Data, modifier);
break;
case VariantType::Int2:
Deserialize(value, *(Int2*)v.AsData, modifier);
break;
@@ -329,13 +347,13 @@ void Serialization::Deserialize(ISerializable::DeserializeStream& stream, Varian
Deserialize(value, *(Rectangle*)v.AsData, modifier);
break;
case VariantType::BoundingBox:
Deserialize(value, *(BoundingBox*)v.AsBlob.Data, modifier);
Deserialize(value, *(BoundingBox*)v.AsData, modifier);
break;
case VariantType::Transform:
Deserialize(value, *(Transform*)v.AsBlob.Data, modifier);
break;
case VariantType::Ray:
Deserialize(value, *(Ray*)v.AsBlob.Data, modifier);
Deserialize(value, *(Ray*)v.AsData, modifier);
break;
case VariantType::Matrix:
Deserialize(value, *(Matrix*)v.AsBlob.Data, modifier);

View File

@@ -7,6 +7,9 @@
#include "MemoryReadStream.h"
#include "Engine/Core/Types/CommonValue.h"
#include "Engine/Core/Types/Variant.h"
#include "Engine/Core/Math/Double2.h"
#include "Engine/Core/Math/Double3.h"
#include "Engine/Core/Math/Double4.h"
#include "Engine/Core/Collections/Dictionary.h"
#include "Engine/Content/Asset.h"
#include "Engine/Core/Cache.h"
@@ -413,6 +416,15 @@ void ReadStream::ReadVariant(Variant* data)
case VariantType::Vector4:
ReadBytes(&data->AsData, sizeof(Vector4));
break;
case VariantType::Double2:
ReadBytes(&data->AsData, sizeof(Double2));
break;
case VariantType::Double3:
ReadBytes(&data->AsData, sizeof(Double3));
break;
case VariantType::Double4:
ReadBytes(data->AsBlob.Data, sizeof(Double4));
break;
case VariantType::Color:
ReadBytes(&data->AsData, sizeof(Color));
break;
@@ -420,7 +432,7 @@ void ReadStream::ReadVariant(Variant* data)
ReadBytes(&data->AsData, sizeof(Guid));
break;
case VariantType::BoundingBox:
ReadBytes(data->AsBlob.Data, sizeof(BoundingBox));
ReadBytes(&data->AsData, sizeof(BoundingBox));
break;
case VariantType::BoundingSphere:
ReadBytes(&data->AsData, sizeof(BoundingSphere));
@@ -435,7 +447,7 @@ void ReadStream::ReadVariant(Variant* data)
ReadBytes(&data->AsData, sizeof(Rectangle));
break;
case VariantType::Ray:
ReadBytes(data->AsBlob.Data, sizeof(Ray));
ReadBytes(&data->AsData, sizeof(Ray));
break;
case VariantType::Matrix:
ReadBytes(data->AsBlob.Data, sizeof(Matrix));
@@ -679,13 +691,13 @@ void WriteStream::WriteVariant(const Variant& data)
WriteBytes(data.AsBlob.Data, data.AsBlob.Length);
break;
case VariantType::BoundingBox:
WriteBytes(data.AsBlob.Data, sizeof(BoundingBox));
WriteBytes(data.AsData, sizeof(BoundingBox));
break;
case VariantType::Transform:
WriteBytes(data.AsBlob.Data, sizeof(Transform));
break;
case VariantType::Ray:
WriteBytes(data.AsBlob.Data, sizeof(Ray));
WriteBytes(data.AsData, sizeof(Ray));
break;
case VariantType::Matrix:
WriteBytes(data.AsBlob.Data, sizeof(Matrix));
@@ -695,28 +707,37 @@ void WriteStream::WriteVariant(const Variant& data)
Write(&id);
break;
case VariantType::Vector2:
Write(data.AsData, sizeof(Vector2));
WriteBytes(data.AsData, sizeof(Vector2));
break;
case VariantType::Vector3:
Write(data.AsData, sizeof(Vector3));
WriteBytes(data.AsData, sizeof(Vector3));
break;
case VariantType::Vector4:
Write(data.AsData, sizeof(Vector4));
WriteBytes(data.AsData, sizeof(Vector4));
break;
case VariantType::Double2:
WriteBytes(data.AsData, sizeof(Double2));
break;
case VariantType::Double3:
WriteBytes(data.AsData, sizeof(Double3));
break;
case VariantType::Double4:
WriteBytes(data.AsBlob.Data, sizeof(Double4));
break;
case VariantType::Color:
Write(data.AsData, sizeof(Color));
WriteBytes(data.AsData, sizeof(Color));
break;
case VariantType::Guid:
Write(data.AsData, sizeof(Guid));
WriteBytes(data.AsData, sizeof(Guid));
break;
case VariantType::Quaternion:
Write(data.AsData, sizeof(Quaternion));
WriteBytes(data.AsData, sizeof(Quaternion));
break;
case VariantType::Rectangle:
Write(data.AsData, sizeof(Rectangle));
WriteBytes(data.AsData, sizeof(Rectangle));
break;
case VariantType::BoundingSphere:
Write(data.AsData, sizeof(BoundingSphere));
WriteBytes(data.AsData, sizeof(BoundingSphere));
break;
case VariantType::Array:
id.A = ((Array<Variant>*)data.AsData)->Count();