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:
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user