Refactor engine to support double-precision vectors

This commit is contained in:
Wojtek Figat
2022-06-13 00:40:32 +02:00
parent f82e370392
commit a881c90b2e
744 changed files with 19062 additions and 12467 deletions

View File

@@ -41,7 +41,7 @@ void ChangeIds(rapidjson_flax::Value& obj, rapidjson_flax::Document& document, c
'0','0','0','0','0','0','0','0','0','0',
'0','0','0','0','0','0','0','0','0','0',
'0','0'
// @formatter:on
// @formatter:on
};
static const char* digits = "0123456789abcdef";
uint32 n = value.A;
@@ -81,6 +81,115 @@ void JsonTools::ChangeIds(Document& doc, const Dictionary<Guid, Guid>& mapping)
::ChangeIds(doc, doc, mapping);
}
Float2 JsonTools::GetFloat2(const Value& value)
{
Float2 result;
const auto mX = value.FindMember("X");
const auto mY = value.FindMember("Y");
result.X = mX != value.MemberEnd() ? mX->value.GetFloat() : 0.0f;
result.Y = mY != value.MemberEnd() ? mY->value.GetFloat() : 0.0f;
return result;
}
Float3 JsonTools::GetFloat3(const Value& value)
{
Float3 result;
const auto mX = value.FindMember("X");
const auto mY = value.FindMember("Y");
const auto mZ = value.FindMember("Z");
result.X = mX != value.MemberEnd() ? mX->value.GetFloat() : 0.0f;
result.Y = mY != value.MemberEnd() ? mY->value.GetFloat() : 0.0f;
result.Z = mZ != value.MemberEnd() ? mZ->value.GetFloat() : 0.0f;
return result;
}
Float4 JsonTools::GetFloat4(const Value& value)
{
Float4 result;
const auto mX = value.FindMember("X");
const auto mY = value.FindMember("Y");
const auto mZ = value.FindMember("Z");
const auto mW = value.FindMember("W");
result.X = mX != value.MemberEnd() ? mX->value.GetFloat() : 0.0f;
result.Y = mY != value.MemberEnd() ? mY->value.GetFloat() : 0.0f;
result.Z = mZ != value.MemberEnd() ? mZ->value.GetFloat() : 0.0f;
result.W = mW != value.MemberEnd() ? mW->value.GetFloat() : 0.0f;
return result;
}
Double2 JsonTools::GetDouble2(const Value& value)
{
Double2 result;
const auto mX = value.FindMember("X");
const auto mY = value.FindMember("Y");
result.X = mX != value.MemberEnd() ? mX->value.GetDouble() : 0.0;
result.Y = mY != value.MemberEnd() ? mY->value.GetDouble() : 0.0;
return result;
}
Double3 JsonTools::GetDouble3(const Value& value)
{
Double3 result;
const auto mX = value.FindMember("X");
const auto mY = value.FindMember("Y");
const auto mZ = value.FindMember("Z");
result.X = mX != value.MemberEnd() ? mX->value.GetDouble() : 0.0;
result.Y = mY != value.MemberEnd() ? mY->value.GetDouble() : 0.0;
result.Z = mZ != value.MemberEnd() ? mZ->value.GetDouble() : 0.0;
return result;
}
Double4 JsonTools::GetDouble4(const Value& value)
{
Double4 result;
const auto mX = value.FindMember("X");
const auto mY = value.FindMember("Y");
const auto mZ = value.FindMember("Z");
const auto mW = value.FindMember("W");
result.X = mX != value.MemberEnd() ? mX->value.GetDouble() : 0.0;
result.Y = mY != value.MemberEnd() ? mY->value.GetDouble() : 0.0;
result.Z = mZ != value.MemberEnd() ? mZ->value.GetDouble() : 0.0;
result.W = mW != value.MemberEnd() ? mW->value.GetDouble() : 0.0;
return result;
}
Color JsonTools::GetColor(const Value& value)
{
Color result;
const auto mR = value.FindMember("R");
const auto mG = value.FindMember("G");
const auto mB = value.FindMember("B");
const auto mA = value.FindMember("A");
result.R = mR != value.MemberEnd() ? mR->value.GetFloat() : 0.0f;
result.G = mG != value.MemberEnd() ? mG->value.GetFloat() : 0.0f;
result.B = mB != value.MemberEnd() ? mB->value.GetFloat() : 0.0f;
result.A = mA != value.MemberEnd() ? mA->value.GetFloat() : 0.0f;
return result;
}
Quaternion JsonTools::GetQuaternion(const Value& value)
{
Quaternion result;
const auto mX = value.FindMember("X");
const auto mY = value.FindMember("Y");
const auto mZ = value.FindMember("Z");
const auto mW = value.FindMember("W");
result.X = mX != value.MemberEnd() ? mX->value.GetFloat() : 0.0f;
result.Y = mY != value.MemberEnd() ? mY->value.GetFloat() : 0.0f;
result.Z = mZ != value.MemberEnd() ? mZ->value.GetFloat() : 0.0f;
result.W = mW != value.MemberEnd() ? mW->value.GetFloat() : 0.0f;
return result;
}
Ray JsonTools::GetRay(const Value& value)
{
return Ray(
GetVector3(value, "Position", Vector3::Zero),
GetVector3(value, "Direction", Vector3::One)
);
}
Matrix JsonTools::GetMatrix(const Value& value)
{
Matrix result;
@@ -103,6 +212,48 @@ Matrix JsonTools::GetMatrix(const Value& value)
return result;
}
Transform JsonTools::GetTransform(const Value& value)
{
return Transform(
GetVector3(value, "Translation", Vector3::Zero),
GetQuaternion(value, "Orientation", Quaternion::Identity),
GetFloat3(value, "Scale", Float3::One)
);
}
void JsonTools::GetTransform(Transform& result, const Value& value)
{
GetVector3(result.Translation, value, "Translation");
GetQuaternion(result.Orientation, value, "Orientation");
GetFloat3(result.Scale, value, "Scale");
}
Plane JsonTools::GetPlane(const Value& value)
{
Plane result;
const auto mD = value.FindMember("D");
result.Normal = GetVector3(value, "Normal", Vector3::One);
result.D = (Real)(mD != value.MemberEnd() ? mD->value.GetDouble() : 0.0);
return result;
}
BoundingSphere JsonTools::GetBoundingSphere(const Value& value)
{
BoundingSphere result;
const auto mRadius = value.FindMember("Radius");
result.Center = GetVector3(value, "Center", Vector3::Zero);
result.Radius = mRadius != value.MemberEnd() ? mRadius->value.GetFloat() : 0.0f;
return result;
}
BoundingBox JsonTools::GetBoundingBox(const Value& value)
{
return BoundingBox(
GetVector3(value, "Minimum", Vector3::Zero),
GetVector3(value, "Maximum", Vector3::Zero)
);
}
Guid JsonTools::GetGuid(const Value& value)
{
if (value.IsNull())
@@ -124,7 +275,6 @@ Guid JsonTools::GetGuid(const Value& value)
return result;
}
DateTime JsonTools::GetDate(const Value& value)
{
return DateTime(value.GetInt64());
@@ -155,13 +305,13 @@ CommonValue JsonTools::GetCommonValue(const Value& value)
result = v.GetFloat();
break;
case CommonType::Vector2:
result = GetVector2(v);
result = GetFloat2(v);
break;
case CommonType::Vector3:
result = GetVector3(v);
result = GetFloat3(v);
break;
case CommonType::Vector4:
result = GetVector4(v);
result = GetFloat4(v);
break;
case CommonType::Color:
result = GetColor(v);
@@ -207,7 +357,7 @@ CommonValue JsonTools::GetCommonValue(const Value& value)
result = FindObject(GetGuid(v), ScriptingObject::GetStaticClass());
break;
default:
CRASH;
CRASH;
break;
}
}

View File

@@ -28,12 +28,10 @@ struct CommonValue;
class FLAXENGINE_API JsonTools
{
public:
typedef rapidjson_flax::Document Document;
typedef rapidjson_flax::Value Value;
public:
FORCE_INLINE static void MergeDocuments(Document& target, Document& source)
{
MergeObjects(target, source, target.GetAllocator());
@@ -49,105 +47,48 @@ public:
static void ChangeIds(Document& doc, const Dictionary<Guid, Guid, HeapAllocation>& mapping);
public:
static Vector2 GetVector2(const Value& value)
FORCE_INLINE static Vector2 GetVector2(const Value& value)
{
Vector2 result;
const auto mX = value.FindMember("X");
const auto mY = value.FindMember("Y");
result.X = mX != value.MemberEnd() ? mX->value.GetFloat() : 0.0f;
result.Y = mY != value.MemberEnd() ? mY->value.GetFloat() : 0.0f;
return result;
#if USE_LARGE_WORLDS
return GetDouble2(value);
#else
return GetFloat2(value);
#endif
}
static Vector3 GetVector3(const Value& value)
FORCE_INLINE static Vector3 GetVector3(const Value& value)
{
Vector3 result;
const auto mX = value.FindMember("X");
const auto mY = value.FindMember("Y");
const auto mZ = value.FindMember("Z");
result.X = mX != value.MemberEnd() ? mX->value.GetFloat() : 0.0f;
result.Y = mY != value.MemberEnd() ? mY->value.GetFloat() : 0.0f;
result.Z = mZ != value.MemberEnd() ? mZ->value.GetFloat() : 0.0f;
return result;
#if USE_LARGE_WORLDS
return GetDouble3(value);
#else
return GetFloat3(value);
#endif
}
static Vector4 GetVector4(const Value& value)
FORCE_INLINE static Vector4 GetVector4(const Value& value)
{
Vector4 result;
const auto mX = value.FindMember("X");
const auto mY = value.FindMember("Y");
const auto mZ = value.FindMember("Z");
const auto mW = value.FindMember("W");
result.X = mX != value.MemberEnd() ? mX->value.GetFloat() : 0.0f;
result.Y = mY != value.MemberEnd() ? mY->value.GetFloat() : 0.0f;
result.Z = mZ != value.MemberEnd() ? mZ->value.GetFloat() : 0.0f;
result.W = mW != value.MemberEnd() ? mW->value.GetFloat() : 0.0f;
return result;
#if USE_LARGE_WORLDS
return GetDouble4(value);
#else
return GetFloat4(value);
#endif
}
static Color GetColor(const Value& value)
{
Color result;
const auto mR = value.FindMember("R");
const auto mG = value.FindMember("G");
const auto mB = value.FindMember("B");
const auto mA = value.FindMember("A");
result.R = mR != value.MemberEnd() ? mR->value.GetFloat() : 0.0f;
result.G = mG != value.MemberEnd() ? mG->value.GetFloat() : 0.0f;
result.B = mB != value.MemberEnd() ? mB->value.GetFloat() : 0.0f;
result.A = mA != value.MemberEnd() ? mA->value.GetFloat() : 0.0f;
return result;
}
static Float2 GetFloat2(const Value& value);
static Float3 GetFloat3(const Value& value);
static Float4 GetFloat4(const Value& value);
static Quaternion GetQuaternion(const Value& value)
{
Quaternion result;
const auto mX = value.FindMember("X");
const auto mY = value.FindMember("Y");
const auto mZ = value.FindMember("Z");
const auto mW = value.FindMember("W");
result.X = mX != value.MemberEnd() ? mX->value.GetFloat() : 0.0f;
result.Y = mY != value.MemberEnd() ? mY->value.GetFloat() : 0.0f;
result.Z = mZ != value.MemberEnd() ? mZ->value.GetFloat() : 0.0f;
result.W = mW != value.MemberEnd() ? mW->value.GetFloat() : 0.0f;
return result;
}
static Ray GetRay(const Value& value)
{
return Ray(
GetVector3(value, "Position", Vector3::Zero),
GetVector3(value, "Direction", Vector3::One)
);
}
static Double2 GetDouble2(const Value& value);
static Double3 GetDouble3(const Value& value);
static Double4 GetDouble4(const Value& value);
static Color GetColor(const Value& value);
static Quaternion GetQuaternion(const Value& value);
static Ray GetRay(const Value& value);
static Matrix GetMatrix(const Value& value);
static Transform GetTransform(const Value& value)
{
return Transform(
GetVector3(value, "Translation", Vector3::Zero),
GetQuaternion(value, "Orientation", Quaternion::Identity),
GetVector3(value, "Scale", Vector3::One)
);
}
static void GetTransform(Transform& result, const Value& value)
{
GetVector3(result.Translation, value, "Translation");
GetQuaternion(result.Orientation, value, "Orientation");
GetVector3(result.Scale, value, "Scale");
}
static Plane GetPlane(const Value& value)
{
Plane result;
const auto mD = value.FindMember("D");
result.Normal = GetVector3(value, "Normal", Vector3::One);
result.D = mD != value.MemberEnd() ? mD->value.GetFloat() : 0.0f;
return result;
}
static Transform GetTransform(const Value& value);
static void GetTransform(Transform& result, const Value& value);
static Plane GetPlane(const Value& value);
static Rectangle GetRectangle(const Value& value)
{
@@ -157,33 +98,14 @@ public:
);
}
static BoundingSphere GetBoundingSphere(const Value& value)
{
BoundingSphere result;
const auto mRadius = value.FindMember("Radius");
result.Center = GetVector3(value, "Center", Vector3::Zero);
result.Radius = mRadius != value.MemberEnd() ? mRadius->value.GetFloat() : 0.0f;
return result;
}
static BoundingBox GetBoundingBox(const Value& value)
{
return BoundingBox(
GetVector3(value, "Minimum", Vector3::Zero),
GetVector3(value, "Maximum", Vector3::Zero)
);
}
static BoundingSphere GetBoundingSphere(const Value& value);
static BoundingBox GetBoundingBox(const Value& value);
static Guid GetGuid(const Value& value);
static DateTime GetDate(const Value& value);
static DateTime GetDateTime(const Value& value);
static CommonValue GetCommonValue(const Value& value);
public:
FORCE_INLINE static String GetString(const Value& node, const char* name)
{
auto member = node.FindMember(name);
@@ -191,7 +113,6 @@ public:
}
public:
FORCE_INLINE static bool GetBool(const Value& node, const char* name, const bool defaultValue)
{
auto member = node.FindMember(name);
@@ -235,6 +156,12 @@ public:
DECLARE_GETTER(Vector2);
DECLARE_GETTER(Vector3);
DECLARE_GETTER(Vector4);
DECLARE_GETTER(Float2);
DECLARE_GETTER(Float3);
DECLARE_GETTER(Float4);
DECLARE_GETTER(Double2);
DECLARE_GETTER(Double3);
DECLARE_GETTER(Double4);
DECLARE_GETTER(Color);
DECLARE_GETTER(Quaternion);
DECLARE_GETTER(BoundingBox);
@@ -264,7 +191,6 @@ public:
}
public:
FORCE_INLINE static void GetBool(bool& result, const Value& node, const char* name)
{
const auto member = node.FindMember(name);
@@ -361,6 +287,12 @@ public:
DECLARE_GETTER(Vector2);
DECLARE_GETTER(Vector3);
DECLARE_GETTER(Vector4);
DECLARE_GETTER(Float2);
DECLARE_GETTER(Float3);
DECLARE_GETTER(Float4);
DECLARE_GETTER(Double2);
DECLARE_GETTER(Double3);
DECLARE_GETTER(Double4);
DECLARE_GETTER(Color);
DECLARE_GETTER(Quaternion);
DECLARE_GETTER(BoundingBox);

View File

@@ -4,12 +4,6 @@
#include "Engine/Core/Log.h"
#include "Engine/Core/Types/CommonValue.h"
#include "Engine/Content/Content.h"
#include "Engine/Core/Math/Double2.h"
#include "Engine/Core/Math/Double3.h"
#include "Engine/Core/Math/Double4.h"
#include "Engine/Core/Math/Int2.h"
#include "Engine/Core/Math/Int3.h"
#include "Engine/Core/Math/Int4.h"
#include "Engine/Core/Math/Color.h"
#include "Engine/Core/Math/Plane.h"
#include "Engine/Core/Types/DateTime.h"
@@ -34,13 +28,49 @@ void JsonWriter::Vector2(const ::Vector2& value)
{
StartObject();
JKEY("X");
Float(value.X);
Real(value.X);
JKEY("Y");
Real(value.Y);
EndObject();
}
void JsonWriter::Vector3(const ::Vector3& value)
{
StartObject();
JKEY("X");
Real(value.X);
JKEY("Y");
Real(value.Y);
JKEY("Z");
Real(value.Z);
EndObject();
}
void JsonWriter::Vector4(const ::Vector4& value)
{
StartObject();
JKEY("X");
Real(value.X);
JKEY("Y");
Real(value.Y);
JKEY("Z");
Real(value.Z);
JKEY("W");
Real(value.W);
EndObject();
}
void JsonWriter::Float2(const ::Float2& value)
{
StartObject();
JKEY("X");
Real(value.X);
JKEY("Y");
Float(value.Y);
EndObject();
}
void JsonWriter::Vector3(const ::Vector3& value)
void JsonWriter::Float3(const ::Float3& value)
{
StartObject();
JKEY("X");
@@ -52,7 +82,7 @@ void JsonWriter::Vector3(const ::Vector3& value)
EndObject();
}
void JsonWriter::Vector4(const ::Vector4& value)
void JsonWriter::Float4(const ::Float4& value)
{
StartObject();
JKEY("X");
@@ -310,7 +340,7 @@ void JsonWriter::Transform(const ::Transform& value)
if (!value.Scale.IsOne())
{
JKEY("Scale");
Vector3(value.Scale);
Float3(value.Scale);
}
EndObject();
}
@@ -328,10 +358,10 @@ void JsonWriter::Transform(const ::Transform& value, const ::Transform* other)
JKEY("Orientation");
Quaternion(value.Orientation);
}
if (!other || !Vector3::NearEqual(value.Scale, other->Scale))
if (!other || !Float3::NearEqual(value.Scale, other->Scale))
{
JKEY("Scale");
Vector3(value.Scale);
Float3(value.Scale);
}
EndObject();
}
@@ -342,7 +372,7 @@ void JsonWriter::Plane(const ::Plane& value)
JKEY("Normal");
Vector3(value.Normal);
JKEY("D");
Float(value.D);
Real(value.D);
EndObject();
}
@@ -350,9 +380,9 @@ void JsonWriter::Rectangle(const ::Rectangle& value)
{
StartObject();
JKEY("Location");
Vector2(value.Location);
Float2(value.Location);
JKEY("Size");
Vector2(value.Size);
Float2(value.Size);
EndObject();
}
@@ -362,7 +392,7 @@ void JsonWriter::BoundingSphere(const ::BoundingSphere& value)
JKEY("Center");
Vector3(value.Center);
JKEY("Radius");
Float(value.Radius);
Real(value.Radius);
EndObject();
}

View File

@@ -20,7 +20,6 @@ class ISerializable;
class FLAXENGINE_API JsonWriter
{
public:
typedef char CharType;
virtual ~JsonWriter() = default;
@@ -42,7 +41,6 @@ public:
virtual void EndArray(int32 count = 0) = 0;
public:
FORCE_INLINE void Key(const StringAnsiView& str)
{
Key(str.Get(), static_cast<unsigned>(str.Length()));
@@ -106,10 +104,22 @@ public:
Int(static_cast<int32>(value));
}
FORCE_INLINE void Real(Real d)
{
#if USE_LARGE_WORLDS
Double(d);
#else
Float(d);
#endif
}
void DateTime(const DateTime& value);
void Vector2(const Vector2& value);
void Vector3(const Vector3& value);
void Vector4(const Vector4& value);
void Float2(const Float2& value);
void Float3(const Float3& value);
void Float4(const Float4& value);
void Double2(const Double2& value);
void Double3(const Double3& value);
void Double4(const Double4& value);

View File

@@ -16,7 +16,6 @@ class ISerializable;
class FLAXENGINE_API ReadStream : public Stream
{
public:
/// <summary>
/// Reads bytes from the stream
/// </summary>
@@ -37,7 +36,6 @@ public:
}
public:
// Reads byte from the stream
// @returns Single byte
byte ReadByte()
@@ -147,7 +145,6 @@ public:
}
public:
// Reads StringAnsi from the stream
// @param data Data to read
void ReadStringAnsi(StringAnsi* data);
@@ -166,7 +163,6 @@ public:
void ReadString(String* data, int16 lock);
public:
// Reads CommonValue from the stream
// @param data Data to read
void ReadCommonValue(CommonValue* data);
@@ -202,7 +198,14 @@ public:
void ReadJson(ISerializable* obj);
public:
// Deserialization of math types with float or double depending on the context (must match serialization)
// Set useDouble=true to explicitly use 64-bit precision for serialized data
void ReadBoundingBox(BoundingBox* box, bool useDouble = false);
void ReadBoundingSphere(BoundingSphere* sphere, bool useDouble = false);
void ReadTransform(Transform* transform, bool useDouble = false);
void ReadRay(Ray* ray, bool useDouble = false);
public:
// [Stream]
bool CanRead() override
{

View File

@@ -10,17 +10,11 @@
#include "Engine/Core/Math/Vector2.h"
#include "Engine/Core/Math/Vector3.h"
#include "Engine/Core/Math/Vector4.h"
#include "Engine/Core/Math/Double2.h"
#include "Engine/Core/Math/Double3.h"
#include "Engine/Core/Math/Double4.h"
#include "Engine/Core/Math/Quaternion.h"
#include "Engine/Core/Math/BoundingBox.h"
#include "Engine/Core/Math/BoundingSphere.h"
#include "Engine/Core/Math/Rectangle.h"
#include "Engine/Core/Math/Transform.h"
#include "Engine/Core/Math/Int2.h"
#include "Engine/Core/Math/Int3.h"
#include "Engine/Core/Math/Int4.h"
#include "Engine/Core/Math/Color.h"
#include "Engine/Core/Math/Color32.h"
#include "Engine/Core/Math/Matrix.h"
@@ -153,14 +147,14 @@ void Serialization::Serialize(ISerializable::SerializeStream& stream, const Vari
case VariantType::Asset:
stream.Guid(v.AsAsset ? v.AsAsset->GetID() : Guid::Empty);
break;
case VariantType::Vector2:
stream.Vector2(*(Vector2*)v.AsData);
case VariantType::Float2:
stream.Float2(*(Float2*)v.AsData);
break;
case VariantType::Vector3:
stream.Vector3(*(Vector3*)v.AsData);
case VariantType::Float3:
stream.Float3(*(Float3*)v.AsData);
break;
case VariantType::Vector4:
stream.Vector4(*(Vector4*)v.AsData);
case VariantType::Float4:
stream.Float4(*(Float4*)v.AsData);
break;
case VariantType::Double2:
stream.Double2(v.AsDouble2());
@@ -304,14 +298,14 @@ void Serialization::Deserialize(ISerializable::DeserializeStream& stream, Varian
v.SetBlob(id.A);
Encryption::Base64Decode(value.GetString(), id.A, (byte*)v.AsBlob.Data);
break;
case VariantType::Vector2:
Deserialize(value, *(Vector2*)v.AsData, modifier);
case VariantType::Float2:
Deserialize(value, *(Float2*)v.AsData, modifier);
break;
case VariantType::Vector3:
Deserialize(value, *(Vector3*)v.AsData, modifier);
case VariantType::Float3:
Deserialize(value, *(Float3*)v.AsData, modifier);
break;
case VariantType::Vector4:
Deserialize(value, *(Vector4*)v.AsData, modifier);
case VariantType::Float4:
Deserialize(value, *(Float4*)v.AsData, modifier);
break;
case VariantType::Double2:
Deserialize(value, *(Double2*)v.AsData, modifier);
@@ -338,7 +332,7 @@ void Serialization::Deserialize(ISerializable::DeserializeStream& stream, Varian
Deserialize(value, *(Guid*)v.AsData, modifier);
break;
case VariantType::BoundingSphere:
Deserialize(value, *(BoundingSphere*)v.AsData, modifier);
Deserialize(value, v.AsBoundingSphere(), modifier);
break;
case VariantType::Quaternion:
Deserialize(value, *(Quaternion*)v.AsData, modifier);
@@ -347,13 +341,13 @@ void Serialization::Deserialize(ISerializable::DeserializeStream& stream, Varian
Deserialize(value, *(Rectangle*)v.AsData, modifier);
break;
case VariantType::BoundingBox:
Deserialize(value, *(BoundingBox*)v.AsData, modifier);
Deserialize(value, v.AsBoundingBox(), modifier);
break;
case VariantType::Transform:
Deserialize(value, *(Transform*)v.AsBlob.Data, modifier);
break;
case VariantType::Ray:
Deserialize(value, *(Ray*)v.AsData, modifier);
Deserialize(value, v.AsRay(), modifier);
break;
case VariantType::Matrix:
Deserialize(value, *(Matrix*)v.AsBlob.Data, modifier);
@@ -504,12 +498,12 @@ void Serialization::Deserialize(ISerializable::DeserializeStream& stream, Versio
}
}
bool Serialization::ShouldSerialize(const Vector2& v, const void* otherObj)
bool Serialization::ShouldSerialize(const Float2& v, const void* otherObj)
{
return !otherObj || !Vector2::NearEqual(v, *(Vector2*)otherObj, SERIALIZE_EPSILON);
return !otherObj || !Float2::NearEqual(v, *(Float2*)otherObj, SERIALIZE_EPSILON);
}
void Serialization::Deserialize(ISerializable::DeserializeStream& stream, Vector2& v, ISerializeModifier* modifier)
void Serialization::Deserialize(ISerializable::DeserializeStream& stream, Float2& v, ISerializeModifier* modifier)
{
const auto mX = SERIALIZE_FIND_MEMBER(stream, "X");
const auto mY = SERIALIZE_FIND_MEMBER(stream, "Y");
@@ -517,12 +511,12 @@ void Serialization::Deserialize(ISerializable::DeserializeStream& stream, Vector
v.Y = mY != stream.MemberEnd() ? mY->value.GetFloat() : 0.0f;
}
bool Serialization::ShouldSerialize(const Vector3& v, const void* otherObj)
bool Serialization::ShouldSerialize(const Float3& v, const void* otherObj)
{
return !otherObj || !Vector3::NearEqual(v, *(Vector3*)otherObj, SERIALIZE_EPSILON);
return !otherObj || !Float3::NearEqual(v, *(Float3*)otherObj, SERIALIZE_EPSILON);
}
void Serialization::Deserialize(ISerializable::DeserializeStream& stream, Vector3& v, ISerializeModifier* modifier)
void Serialization::Deserialize(ISerializable::DeserializeStream& stream, Float3& v, ISerializeModifier* modifier)
{
const auto mX = SERIALIZE_FIND_MEMBER(stream, "X");
const auto mY = SERIALIZE_FIND_MEMBER(stream, "Y");
@@ -532,12 +526,12 @@ void Serialization::Deserialize(ISerializable::DeserializeStream& stream, Vector
v.Z = mZ != stream.MemberEnd() ? mZ->value.GetFloat() : 0.0f;
}
bool Serialization::ShouldSerialize(const Vector4& v, const void* otherObj)
bool Serialization::ShouldSerialize(const Float4& v, const void* otherObj)
{
return !otherObj || !Vector4::NearEqual(v, *(Vector4*)otherObj, SERIALIZE_EPSILON);
return !otherObj || !Float4::NearEqual(v, *(Float4*)otherObj, SERIALIZE_EPSILON);
}
void Serialization::Deserialize(ISerializable::DeserializeStream& stream, Vector4& v, ISerializeModifier* modifier)
void Serialization::Deserialize(ISerializable::DeserializeStream& stream, Float4& v, ISerializeModifier* modifier)
{
const auto mX = SERIALIZE_FIND_MEMBER(stream, "X");
const auto mY = SERIALIZE_FIND_MEMBER(stream, "Y");

View File

@@ -280,26 +280,26 @@ namespace Serialization
// Math types
FLAXENGINE_API bool ShouldSerialize(const Vector2& v, const void* otherObj);
inline void Serialize(ISerializable::SerializeStream& stream, const Vector2& v, const void* otherObj)
FLAXENGINE_API bool ShouldSerialize(const Float2& v, const void* otherObj);
inline void Serialize(ISerializable::SerializeStream& stream, const Float2& v, const void* otherObj)
{
stream.Vector2(v);
stream.Float2(v);
}
FLAXENGINE_API void Deserialize(ISerializable::DeserializeStream& stream, Vector2& v, ISerializeModifier* modifier);
FLAXENGINE_API void Deserialize(ISerializable::DeserializeStream& stream, Float2& v, ISerializeModifier* modifier);
FLAXENGINE_API bool ShouldSerialize(const Vector3& v, const void* otherObj);
inline void Serialize(ISerializable::SerializeStream& stream, const Vector3& v, const void* otherObj)
FLAXENGINE_API bool ShouldSerialize(const Float3& v, const void* otherObj);
inline void Serialize(ISerializable::SerializeStream& stream, const Float3& v, const void* otherObj)
{
stream.Vector3(v);
stream.Float3(v);
}
FLAXENGINE_API void Deserialize(ISerializable::DeserializeStream& stream, Vector3& v, ISerializeModifier* modifier);
FLAXENGINE_API void Deserialize(ISerializable::DeserializeStream& stream, Float3& v, ISerializeModifier* modifier);
FLAXENGINE_API bool ShouldSerialize(const Vector4& v, const void* otherObj);
inline void Serialize(ISerializable::SerializeStream& stream, const Vector4& v, const void* otherObj)
FLAXENGINE_API bool ShouldSerialize(const Float4& v, const void* otherObj);
inline void Serialize(ISerializable::SerializeStream& stream, const Float4& v, const void* otherObj)
{
stream.Vector4(v);
stream.Float4(v);
}
FLAXENGINE_API void Deserialize(ISerializable::DeserializeStream& stream, Vector4& v, ISerializeModifier* modifier);
FLAXENGINE_API void Deserialize(ISerializable::DeserializeStream& stream, Float4& v, ISerializeModifier* modifier);
FLAXENGINE_API bool ShouldSerialize(const Double2& v, const void* otherObj);
inline void Serialize(ISerializable::SerializeStream& stream, const Double2& v, const void* otherObj)

View File

@@ -7,9 +7,6 @@
#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"
@@ -133,21 +130,21 @@ void ReadStream::ReadCommonValue(CommonValue* data)
break;
case CommonType::Vector2:
{
Vector2 v;
Float2 v;
Read(&v);
data->Set(v);
}
break;
case CommonType::Vector3:
{
Vector3 v;
Float3 v;
Read(&v);
data->Set(v);
}
break;
case CommonType::Vector4:
{
Vector4 v;
Float4 v;
Read(&v);
data->Set(v);
}
@@ -176,7 +173,7 @@ void ReadStream::ReadCommonValue(CommonValue* data)
case CommonType::Box:
{
BoundingBox v;
Read(&v);
ReadBoundingBox(&v);
data->Set(v);
}
break;
@@ -190,14 +187,14 @@ void ReadStream::ReadCommonValue(CommonValue* data)
case CommonType::Transform:
{
Transform v;
Read(&v);
ReadTransform(&v);
data->Set(v);
}
break;
case CommonType::Sphere:
{
BoundingSphere v;
Read(&v);
ReadBoundingSphere(&v);
data->Set(v);
}
break;
@@ -210,7 +207,7 @@ void ReadStream::ReadCommonValue(CommonValue* data)
case CommonType::Ray:
{
Ray v;
Read(&v);
ReadRay(&v);
data->Set(v);
}
break;
@@ -407,14 +404,14 @@ void ReadStream::ReadVariant(Variant* data)
data->SetAsset(LoadAsset(id, Asset::TypeInitializer));
break;
}
case VariantType::Vector2:
ReadBytes(&data->AsData, sizeof(Vector2));
case VariantType::Float2:
ReadBytes(&data->AsData, sizeof(Float2));
break;
case VariantType::Vector3:
ReadBytes(&data->AsData, sizeof(Vector3));
case VariantType::Float3:
ReadBytes(&data->AsData, sizeof(Float3));
break;
case VariantType::Vector4:
ReadBytes(&data->AsData, sizeof(Vector4));
case VariantType::Float4:
ReadBytes(&data->AsData, sizeof(Float4));
break;
case VariantType::Double2:
ReadBytes(&data->AsData, sizeof(Double2));
@@ -432,22 +429,22 @@ void ReadStream::ReadVariant(Variant* data)
ReadBytes(&data->AsData, sizeof(Guid));
break;
case VariantType::BoundingBox:
ReadBytes(&data->AsData, sizeof(BoundingBox));
ReadBoundingBox(&data->AsBoundingBox());
break;
case VariantType::BoundingSphere:
ReadBytes(&data->AsData, sizeof(BoundingSphere));
ReadBoundingSphere(&data->AsBoundingSphere());
break;
case VariantType::Quaternion:
ReadBytes(&data->AsData, sizeof(Quaternion));
break;
case VariantType::Transform:
ReadBytes(data->AsBlob.Data, sizeof(Transform));
ReadTransform((Transform*)&data->AsData);
break;
case VariantType::Rectangle:
ReadBytes(&data->AsData, sizeof(Rectangle));
break;
case VariantType::Ray:
ReadBytes(&data->AsData, sizeof(Ray));
ReadRay(&data->AsRay());
break;
case VariantType::Matrix:
ReadBytes(data->AsBlob.Data, sizeof(Matrix));
@@ -500,7 +497,7 @@ void ReadStream::ReadVariant(Variant* data)
break;
}
default:
CRASH;
CRASH;
}
}
@@ -527,6 +524,116 @@ void ReadStream::ReadJson(ISerializable* obj)
SetPosition(GetPosition() + size);
}
void ReadStream::ReadBoundingBox(BoundingBox* box, bool useDouble)
{
#if USE_LARGE_WORLDS
if (useDouble)
Read(box);
else
{
Float3 min, max;
Read(&min);
Read(&max);
box->Minimum = min;
box->Maximum = max;
}
#else
if (useDouble)
{
Double3 min, max;
Read(&min);
Read(&max);
box->Minimum = min;
box->Maximum = max;
}
else
Read(box);
#endif
}
void ReadStream::ReadBoundingSphere(BoundingSphere* sphere, bool useDouble)
{
#if USE_LARGE_WORLDS
if (useDouble)
Read(sphere);
else
{
Float3 center;
float radius;
Read(&center);
Read(&radius);
sphere->Center = center;
sphere->Radius = radius;
}
#else
if (useDouble)
{
Double3 center;
double radius;
Read(&center);
Read(&radius);
sphere->Center = center;
sphere->Radius = (float)radius;
}
else
Read(sphere);
#endif
}
void ReadStream::ReadTransform(Transform* transform, bool useDouble)
{
#if USE_LARGE_WORLDS
if (useDouble)
Read(transform);
else
{
Float3 translation;
Read(&translation);
Read(&transform->Orientation);
Read(&transform->Scale);
transform->Translation = translation;
}
#else
if (useDouble)
{
Double3 translation;
Read(&translation);
Read(&transform->Orientation);
Read(&transform->Scale);
transform->Translation = translation;
}
else
Read(transform);
#endif
}
void ReadStream::ReadRay(Ray* ray, bool useDouble)
{
#if USE_LARGE_WORLDS
if (useDouble)
Read(ray);
else
{
Float3 position, direction;
Read(&position);
Read(&direction);
ray->Position = position;
ray->Direction = direction;
}
#else
if (useDouble)
{
Double3 position, direction;
Read(&position);
Read(&direction);
ray->Position = position;
ray->Direction = direction;
}
else
Read(ray);
#endif
}
void WriteStream::WriteText(const StringView& text)
{
WriteBytes(text.Get(), sizeof(Char) * text.Length());
@@ -603,22 +710,22 @@ void WriteStream::WriteCommonValue(const CommonValue& data)
WriteString(data.AsString, 953);
break;
case CommonType::Box:
Write(&data.AsBox);
WriteBoundingBox(data.AsBox);
break;
case CommonType::Rotation:
Write(&data.AsRotation);
break;
case CommonType::Transform:
Write(&data.AsTransform);
WriteTransform(data.AsTransform);
break;
case CommonType::Sphere:
Write(&data.AsSphere);
WriteBoundingSphere(data.AsSphere);
break;
case CommonType::Rectangle:
Write(&data.AsRectangle);
break;
case CommonType::Ray:
Write(&data.AsRay);
WriteRay(data.AsRay);
break;
case CommonType::Matrix:
Write(&data.AsMatrix);
@@ -691,13 +798,13 @@ void WriteStream::WriteVariant(const Variant& data)
WriteBytes(data.AsBlob.Data, data.AsBlob.Length);
break;
case VariantType::BoundingBox:
WriteBytes(data.AsData, sizeof(BoundingBox));
WriteBoundingBox(data.AsBoundingBox());
break;
case VariantType::Transform:
WriteBytes(data.AsBlob.Data, sizeof(Transform));
WriteTransform(data.AsTransform());
break;
case VariantType::Ray:
WriteBytes(data.AsData, sizeof(Ray));
WriteRay(data.AsRay());
break;
case VariantType::Matrix:
WriteBytes(data.AsBlob.Data, sizeof(Matrix));
@@ -706,14 +813,14 @@ void WriteStream::WriteVariant(const Variant& data)
id = data.AsAsset ? data.AsAsset->GetID() : Guid::Empty;
Write(&id);
break;
case VariantType::Vector2:
WriteBytes(data.AsData, sizeof(Vector2));
case VariantType::Float2:
WriteBytes(data.AsData, sizeof(Float2));
break;
case VariantType::Vector3:
WriteBytes(data.AsData, sizeof(Vector3));
case VariantType::Float3:
WriteBytes(data.AsData, sizeof(Float3));
break;
case VariantType::Vector4:
WriteBytes(data.AsData, sizeof(Vector4));
case VariantType::Float4:
WriteBytes(data.AsData, sizeof(Float4));
break;
case VariantType::Double2:
WriteBytes(data.AsData, sizeof(Double2));
@@ -737,7 +844,7 @@ void WriteStream::WriteVariant(const Variant& data)
WriteBytes(data.AsData, sizeof(Rectangle));
break;
case VariantType::BoundingSphere:
WriteBytes(data.AsData, sizeof(BoundingSphere));
WriteBoundingSphere(data.AsBoundingSphere());
break;
case VariantType::Array:
id.A = ((Array<Variant>*)data.AsData)->Count();
@@ -782,7 +889,7 @@ void WriteStream::WriteVariant(const Variant& data)
break;
}
default:
CRASH;
CRASH;
}
}
@@ -804,6 +911,102 @@ void WriteStream::WriteJson(ISerializable* obj, const void* otherObj)
WriteInt32(0);
}
void WriteStream::WriteBoundingBox(const BoundingBox& box, bool useDouble)
{
#if USE_LARGE_WORLDS
if (useDouble)
Write(&box);
else
{
Float3 min = box.Minimum, max = box.Maximum;
Write(&min);
Write(&max);
}
#else
if (useDouble)
{
Double3 min = box.Minimum, max = box.Maximum;
Write(&min);
Write(&max);
}
else
Write(&box);
#endif
}
void WriteStream::WriteBoundingSphere(const BoundingSphere& sphere, bool useDouble)
{
#if USE_LARGE_WORLDS
if (useDouble)
Write(&sphere);
else
{
Float3 center = sphere.Center;
float radius = (float)sphere.Radius;
Write(&center);
Write(&radius);
}
#else
if (useDouble)
{
Double3 center = sphere.Center;
float radius = (float)sphere.Radius;
Write(&center);
Write(&radius);
}
else
Write(&sphere);
#endif
}
void WriteStream::WriteTransform(const Transform& transform, bool useDouble)
{
#if USE_LARGE_WORLDS
if (useDouble)
Write(&transform);
else
{
Float3 translation = transform.Translation;
Write(&translation);
Write(&transform.Orientation);
Write(&transform.Scale);
}
#else
if (useDouble)
{
Double3 translation = transform.Translation;
Write(&translation);
Write(&transform.Orientation);
Write(&transform.Scale);
}
else
Write(&transform);
#endif
}
void WriteStream::WriteRay(const Ray& ray, bool useDouble)
{
#if USE_LARGE_WORLDS
if (useDouble)
Write(&ray);
else
{
Float3 position = ray.Position, direction = ray.Direction;
Write(&position);
Write(&direction);
}
#else
if (useDouble)
{
Double3 position = ray.Position, direction = ray.Direction;
Write(&position);
Write(&direction);
}
else
Write(&ray);
#endif
}
Array<byte> JsonSerializer::SaveToBytes(ISerializable* obj)
{
Array<byte> result;

View File

@@ -16,7 +16,6 @@ class ISerializable;
class FLAXENGINE_API WriteStream : public Stream
{
public:
/// <summary>
/// Writes bytes to the stream
/// </summary>
@@ -37,7 +36,6 @@ public:
}
public:
// Writes byte to the stream
// @param data Data to write
FORCE_INLINE void WriteByte(byte data)
@@ -137,7 +135,6 @@ public:
}
public:
// Writes text to the stream
// @param data Text to write
// @param length Text length
@@ -186,7 +183,6 @@ public:
void WriteStringAnsi(const StringAnsiView& data, int8 lock);
public:
// Writes CommonValue to the stream
// @param data Data to write
void WriteCommonValue(const CommonValue& data);
@@ -222,7 +218,14 @@ public:
void WriteJson(ISerializable* obj, const void* otherObj = nullptr);
public:
// Serialization of math types with float or double depending on the context (must match deserialization)
// Set useDouble=true to explicitly use 64-bit precision for serialized data
void WriteBoundingBox(const BoundingBox& box, bool useDouble = false);
void WriteBoundingSphere(const BoundingSphere& sphere, bool useDouble = false);
void WriteTransform(const Transform& transform, bool useDouble = false);
void WriteRay(const Ray& ray, bool useDouble = false);
public:
// [Stream]
bool CanWrite() override
{