LumixEngine/src/engine/serializer.h
2019-10-14 22:28:06 +02:00

178 lines
No EOL
5.7 KiB
C++

#pragma once
#include "lumix.h"
namespace Lumix
{
struct DVec3;
class InputMemoryStream;
class OutputMemoryStream;
struct LocalRigidTransform;
struct Quat;
struct RigidTransform;
class String;
struct Transform;
struct Vec3;
struct Vec4;
struct EntityGUID
{
u64 value;
bool operator ==(const EntityGUID& rhs) const { return value == rhs.value; }
};
const EntityGUID INVALID_ENTITY_GUID = { 0xffffFFFFffffFFFF };
inline bool isValid(EntityGUID guid) { return guid.value != INVALID_ENTITY_GUID.value; }
struct ISaveEntityGUIDMap
{
virtual ~ISaveEntityGUIDMap() {}
virtual EntityGUID get(EntityPtr entity) = 0;
};
struct ILoadEntityGUIDMap
{
virtual ~ILoadEntityGUIDMap() {}
virtual EntityPtr get(EntityGUID guid) = 0;
};
struct LUMIX_ENGINE_API ISerializer
{
virtual ~ISerializer() {}
virtual void write(const char* label, EntityPtr entity) = 0;
virtual void write(const char* label, EntityRef entity) = 0;
virtual void write(const char* label, const Transform& value) = 0;
virtual void write(const char* label, const RigidTransform& value) = 0;
virtual void write(const char* label, const LocalRigidTransform& value) = 0;
virtual void write(const char* label, const Vec4& value) = 0;
virtual void write(const char* label, const DVec3& value) = 0;
virtual void write(const char* label, const Vec3& value) = 0;
virtual void write(const char* label, const Quat& value) = 0;
virtual void write(const char* label, float value) = 0;
virtual void write(const char* label, double value) = 0;
virtual void write(const char* label, bool value) = 0;
virtual void write(const char* label, i64 value) = 0;
virtual void write(const char* label, u64 value) = 0;
virtual void write(const char* label, i32 value) = 0;
virtual void write(const char* label, u32 value) = 0;
virtual void write(const char* label, u16 value) = 0;
virtual void write(const char* label, i8 value) = 0;
virtual void write(const char* label, u8 value) = 0;
virtual void write(const char* label, const char* value) = 0;
virtual EntityGUID getGUID(EntityRef entity) = 0;
};
struct LUMIX_ENGINE_API IDeserializer
{
virtual ~IDeserializer() {}
virtual void read(Ref<EntityPtr> entity) = 0;
virtual void read(Ref<EntityRef> entity) = 0;
virtual void read(Ref<Transform> value) = 0;
virtual void read(Ref<RigidTransform> value) = 0;
virtual void read(Ref<LocalRigidTransform> value) = 0;
virtual void read(Ref<Vec4> value) = 0;
virtual void read(Ref<DVec3> value) = 0;
virtual void read(Ref<Vec3> value) = 0;
virtual void read(Ref<Quat> value) = 0;
virtual void read(Ref<float> value) = 0;
virtual void read(Ref<double> value) = 0;
virtual void read(Ref<bool> value) = 0;
virtual void read(Ref<u64> value) = 0;
virtual void read(Ref<i64> value) = 0;
virtual void read(Ref<u32> value) = 0;
virtual void read(Ref<i32> value) = 0;
virtual void read(Ref<u16> value) = 0;
virtual void read(Ref<u8> value) = 0;
virtual void read(Ref<i8> value) = 0;
virtual void read(const Span<char>& value) = 0;
virtual void read(Ref<String> value) = 0;
virtual EntityPtr getEntity(EntityGUID guid) = 0;
};
struct LUMIX_ENGINE_API TextSerializer final : public ISerializer
{
TextSerializer(OutputMemoryStream& _blob, ISaveEntityGUIDMap& _entity_map)
: blob(_blob)
, entity_map(_entity_map)
{
}
void write(const char* label, EntityPtr entity) override;
void write(const char* label, EntityRef entity) override;
void write(const char* label, const RigidTransform& value) override;
void write(const char* label, const LocalRigidTransform& value) override;
void write(const char* label, const Transform& value) override;
void write(const char* label, const Vec4& value) override;
void write(const char* label, const DVec3& value) override;
void write(const char* label, const Vec3& value) override;
void write(const char* label, const Quat& value) override;
void write(const char* label, float value) override;
void write(const char* label, double value) override;
void write(const char* label, bool value) override;
void write(const char* label, i64 value) override;
void write(const char* label, u64 value) override;
void write(const char* label, i32 value) override;
void write(const char* label, u32 value) override;
void write(const char* label, u16 value) override;
void write(const char* label, i8 value) override;
void write(const char* label, u8 value) override;
void write(const char* label, const char* value) override;
EntityGUID getGUID(EntityRef entity) override;
OutputMemoryStream& blob;
ISaveEntityGUIDMap& entity_map;
};
struct LUMIX_ENGINE_API TextDeserializer final : public IDeserializer
{
TextDeserializer(InputMemoryStream& _blob, ILoadEntityGUIDMap& _entity_map)
: blob(_blob)
, entity_map(_entity_map)
{
}
void read(Ref<EntityPtr> entity) override;
void read(Ref<EntityRef> entity) override;
void read(Ref<RigidTransform> value) override;
void read(Ref<LocalRigidTransform> value) override;
void read(Ref<Transform> value) override;
void read(Ref<Vec4> value) override;
void read(Ref<DVec3> value) override;
void read(Ref<Vec3> value) override;
void read(Ref<Quat> value) override;
void read(Ref<float> value) override;
void read(Ref<double> value) override;
void read(Ref<bool> value) override;
void read(Ref<u64> value) override;
void read(Ref<i64> value) override;
void read(Ref<u32> value) override;
void read(Ref<i32> value) override;
void read(Ref<u16> value) override;
void read(Ref<u8> value) override;
void read(Ref<i8> value) override;
void read(const Span<char>& value) override;
void read(Ref<String> value) override;
EntityPtr getEntity(EntityGUID guid) override;
void skip();
u32 readU32();
u64 readU64();
InputMemoryStream& blob;
ILoadEntityGUIDMap& entity_map;
};
}