Refactor engine to support double-precision vectors
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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(¢er);
|
||||
Read(&radius);
|
||||
sphere->Center = center;
|
||||
sphere->Radius = radius;
|
||||
}
|
||||
#else
|
||||
if (useDouble)
|
||||
{
|
||||
Double3 center;
|
||||
double radius;
|
||||
Read(¢er);
|
||||
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(¢er);
|
||||
Write(&radius);
|
||||
}
|
||||
#else
|
||||
if (useDouble)
|
||||
{
|
||||
Double3 center = sphere.Center;
|
||||
float radius = (float)sphere.Radius;
|
||||
Write(¢er);
|
||||
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;
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user