Skip to content

Commit 1d00940

Browse files
committed
Refactor asset serialization to no longer user bitstream
1 parent a9fc055 commit 1d00940

File tree

74 files changed

+927
-574
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

74 files changed

+927
-574
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
#pragma once
2+
3+
#include "AssetSerializeTraits.h"
4+
5+
#include "Mahakam/Renderer/Animation.h"
6+
7+
#include "Mahakam/BinarySerialization/ContainerSerialization.h"
8+
#include "Mahakam/BinarySerialization/MathSerialization.h"
9+
#include "Mahakam/BinarySerialization/StringSerialization.h"
10+
11+
namespace Mahakam::Serialization
12+
{
13+
template<>
14+
struct SerializeTraits<Animation::Sampler>
15+
{
16+
template<typename Stream>
17+
static bool serialize(Stream& stream, inout<Stream, Animation::Sampler> sampler) noexcept
18+
{
19+
return stream.serialize(sampler.Timestamps)
20+
&& stream.serialize(sampler.Translations)
21+
&& stream.serialize(sampler.Rotations)
22+
&& stream.serialize(sampler.Scales);
23+
}
24+
};
25+
26+
template<>
27+
struct AssetSerializeTraits<Animation>
28+
{
29+
template<typename Stream>
30+
static bool serialize(Stream& stream, inout<Stream, Asset<Animation>> animation) noexcept
31+
{
32+
if constexpr (Stream::writing)
33+
{
34+
return stream.serialize(animation->GetName())
35+
&& stream.serialize(animation->GetDuration())
36+
&& stream.serialize(animation->GetSamplers());
37+
}
38+
else
39+
{
40+
std::string name;
41+
float duration;
42+
Animation::SamplerType samplers{ Allocator::GetAllocator<Animation::Sampler>() };
43+
44+
if (!stream.serialize(name)
45+
|| !stream.serialize(duration)
46+
|| !stream.serialize(samplers))
47+
return false;
48+
49+
animation = Animation::Create(name, std::move(samplers), duration);
50+
}
51+
52+
return true;
53+
}
54+
};
55+
}

Mahakam/src/Mahakam/Asset/AssetDatabase.cpp

Lines changed: 21 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,13 @@
88
#include "Mahakam/Core/Log.h"
99
#include "Mahakam/Core/Random.h"
1010

11-
#include "Mahakam/BinarySerialization/AssetSerialization.h"
12-
#include "Mahakam/BinarySerialization/AnimationSerialization.h"
13-
#include "Mahakam/BinarySerialization/MaterialSerialization.h"
14-
#include "Mahakam/BinarySerialization/MeshSerialization.h"
15-
#include "Mahakam/BinarySerialization/ShaderSerialization.h"
16-
#include "Mahakam/BinarySerialization/TextureCubeSerialization.h"
11+
#include "Mahakam/Asset/AssetSerializeTraits.h"
12+
13+
#include "Mahakam/Asset/AnimationSerialization.h"
14+
#include "Mahakam/Asset/MaterialSerialization.h"
15+
#include "Mahakam/Asset/MeshSerialization.h"
16+
#include "Mahakam/Asset/ShaderSerialization.h"
17+
#include "Mahakam/Asset/TextureCubeSerialization.h"
1718

1819
#include <ryml/rapidyaml-0.4.1.hpp>
1920

@@ -23,6 +24,13 @@
2324

2425
namespace Mahakam
2526
{
27+
template<typename Stream>
28+
static bool SerializeAssetHeader(Stream& stream, Mahakam::Serialization::inout<Stream, AssetDatabase::AssetID> assetID, Mahakam::Serialization::inout<Stream, std::string> extension)
29+
{
30+
return stream.serialize(assetID)
31+
&& stream.serialize(extension);
32+
}
33+
2634
template<const char* Extension, const char* LegacyExt>
2735
void AssetDatabase::LoadLegacySerializer()
2836
{
@@ -85,19 +93,15 @@ namespace Mahakam
8593
AssetDatabase::AssetSerializer serializer;
8694
serializer.Serialize = [](AssetDatabase::Writer& writer, const std::filesystem::path& filepath, Asset<void> asset)
8795
{
88-
return writer.serialize<T>(asset);
89-
90-
//return AssetSerializeTraits<T>::Serialize(writer, static_cast<T*>(asset));
96+
return Serialization::AssetSerializeTraits<T>::serialize(writer, asset);
9197
};
9298
serializer.Deserialize = [](AssetDatabase::Reader& reader, const std::filesystem::path& filepath) -> Asset<void>
9399
{
94100
Asset<T> asset;
95-
if (!reader.serialize<T>(asset))
101+
if (!Serialization::AssetSerializeTraits<T>::serialize(reader, asset))
96102
return nullptr;
97103

98104
return asset;
99-
100-
//return AssetSerializeTraits<T>::Deserialize(reader);
101105
};
102106

103107
return serializer;
@@ -319,8 +323,9 @@ namespace Mahakam
319323
if (iter == s_Serializers.end())
320324
return control;
321325

322-
TrivialVector<uint32_t> buffer;
323-
Writer writer(buffer);
326+
std::filesystem::path filepath = FileUtility::ASSET_PATH / (std::to_string(id) + FileUtility::AssetExtension);
327+
328+
Writer writer(filepath);
324329

325330
// The asset must either be blank or use the same ID as earlier
326331
if (control->ID && control->ID != id)
@@ -337,19 +342,13 @@ namespace Mahakam
337342
return control;
338343
}
339344

340-
std::filesystem::path filepath = FileUtility::ASSET_PATH / (std::to_string(id) + FileUtility::AssetExtension);
341345
if (!iter->second.Serialize(writer, filepath, Asset<void>(control)))
342346
{
343347
MH_WARN("Failed to save asset with ID: {0}", id);
344348
return control;
345349
}
346350

347-
writer.flush();
348-
349-
// Save the asset
350-
std::ofstream filestream(filepath, std::ios::binary);
351-
filestream.write(reinterpret_cast<char*>(writer.get_buffer()), writer.get_num_bytes_serialized());
352-
filestream.close();
351+
writer.close();
353352

354353
s_AssetPaths[id] = filepath;
355354

@@ -434,13 +433,7 @@ namespace Mahakam
434433
return nullptr;
435434
}
436435

437-
// Read file into buffer
438-
TrivialVector<char> buffer;
439-
440-
if (!FileUtility::ReadFile(filepath, buffer))
441-
return nullptr;
442-
443-
Reader reader(buffer.data(), static_cast<uint32_t>(buffer.size() * 8U));
436+
Reader reader(filepath);
444437

445438
AssetID assetID;
446439
std::string extension;

Mahakam/src/Mahakam/Asset/AssetDatabase.h

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#include "Mahakam/Core/SharedLibrary.h"
55
#include "Mahakam/Core/Types.h"
66

7-
#include <bitstream/bitstream.h>
7+
#include "Mahakam/BinarySerialization/FileStream.h"
88

99
#include <filesystem>
1010
#include <string>
@@ -45,8 +45,15 @@ namespace Mahakam
4545
void (*DeleteData)(void*);
4646
};
4747

48-
using Writer = bitstream::growing_bit_writer<TrivialVector<uint32_t>>;
49-
using Reader = bitstream::fixed_bit_reader;
48+
using Writer = Serialization::FileWriter;
49+
using Reader = Serialization::FileReader;
50+
51+
struct StreamBlock
52+
{
53+
Reader Reader;
54+
void (*Stream)(void*) = nullptr;
55+
void (*Load)(void*) = nullptr;
56+
};
5057

5158
struct AssetSerializer
5259
{
@@ -72,15 +79,6 @@ namespace Mahakam
7279

7380
inline static UnorderedMap<std::string, AssetSerializer> s_Serializers;
7481

75-
template<typename Stream>
76-
static bool SerializeAssetHeader(Stream& stream, bitstream::inout<Stream, AssetID> assetID, bitstream::inout<Stream, std::string> extension)
77-
{
78-
BS_ASSERT(stream.template serialize<AssetID>(assetID));
79-
BS_ASSERT(stream.template serialize<std::string>(extension, 32));
80-
81-
return true;
82-
}
83-
8482
template<const char* Extension, const char* LegacyExt>
8583
static void LoadLegacySerializer();
8684

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
#pragma once
2+
3+
#include "AssetDatabase.h"
4+
5+
namespace Mahakam
6+
{
7+
template<size_t I>
8+
struct fixed_string
9+
{
10+
char Chars[I]{};
11+
12+
consteval fixed_string(const char* s) noexcept
13+
{
14+
for (size_t i = 0; i != I; ++i)
15+
Chars[i] = s[i];
16+
}
17+
};
18+
19+
template<size_t I>
20+
fixed_string(const char(&arr)[I]) -> fixed_string<I - 1>;
21+
22+
template<fixed_string S>
23+
struct AssetLookup {};
24+
25+
template<AssetDatabase::AssetID I>
26+
struct AssetBaseLookup
27+
{
28+
constexpr static AssetDatabase::AssetID ID = I;
29+
30+
template<typename T>
31+
operator Asset<T>()
32+
{
33+
return Asset<T>(ID);
34+
}
35+
};
36+
37+
template<>
38+
struct AssetLookup<"test/assets/materials/skybox"> : AssetBaseLookup<1413214623375882268ULL> {};
39+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#pragma once
2+
3+
namespace Mahakam::Serialization
4+
{
5+
template<typename T>
6+
struct AssetSerializeTraits;
7+
}
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
#pragma once
2+
3+
#include "AssetSerializeTraits.h"
4+
5+
#include "Mahakam/BinarySerialization/AssetIDSerialization.h"
6+
#include "Mahakam/BinarySerialization/ContainerSerialization.h"
7+
#include "Mahakam/BinarySerialization/MathSerialization.h"
8+
9+
#include "Mahakam/Renderer/Material.h"
10+
#include "Mahakam/Renderer/Shader.h"
11+
12+
namespace Mahakam::Serialization
13+
{
14+
template<>
15+
struct AssetSerializeTraits<Material>
16+
{
17+
template<auto F, typename Stream>
18+
static bool write_value(Stream& stream, const Material& material, const std::string& name) noexcept
19+
{
20+
return stream.serialize((material.*F)(name));
21+
}
22+
23+
template<auto F, typename T, typename Stream>
24+
static bool read_value(Stream& stream, Material& material, const std::string& name) noexcept
25+
{
26+
T value;
27+
if (!stream.serialize(value))
28+
return false;
29+
30+
(material.*F)(name, value);
31+
32+
return true;
33+
}
34+
35+
template<typename Stream>
36+
static bool serialize(Stream& stream, inout<Stream, Asset<Material>> material) noexcept
37+
{
38+
if constexpr (Stream::writing)
39+
{
40+
MH_SER_ASSERT(stream.serialize(material->GetShader()));
41+
42+
auto& properties = material->GetShader()->GetProperties();
43+
for (auto& kv : properties)
44+
{
45+
switch (kv.second.DataType)
46+
{
47+
case ShaderDataType::Float: MH_SER_ASSERT(write_value<&Material::GetFloat>(stream, *material, kv.first)); break;
48+
case ShaderDataType::Float2: MH_SER_ASSERT(write_value<&Material::GetFloat2>(stream, *material, kv.first)); break;
49+
case ShaderDataType::Float3: MH_SER_ASSERT(write_value<&Material::GetFloat3>(stream, *material, kv.first)); break;
50+
case ShaderDataType::Float4: MH_SER_ASSERT(write_value<&Material::GetFloat4>(stream, *material, kv.first)); break;
51+
case ShaderDataType::Mat3: MH_SER_ASSERT(write_value<&Material::GetMat3>(stream, *material, kv.first)); break;
52+
case ShaderDataType::Mat4: MH_SER_ASSERT(write_value<&Material::GetMat4>(stream, *material, kv.first)); break;
53+
case ShaderDataType::Int: MH_SER_ASSERT(write_value<&Material::GetInt>(stream, *material, kv.first)); break;
54+
case ShaderDataType::Sampler2D: MH_SER_ASSERT(write_value<&Material::GetTexture>(stream, *material, kv.first)); break;
55+
case ShaderDataType::SamplerCube: MH_SER_ASSERT(write_value<&Material::GetTexture>(stream, *material, kv.first)); break;
56+
default: break;
57+
}
58+
}
59+
}
60+
else
61+
{
62+
Asset<Shader> shader;
63+
MH_SER_ASSERT(stream.serialize(shader));
64+
65+
material = Material::Create(shader);
66+
67+
auto& properties = shader->GetProperties();
68+
for (auto& kv : properties)
69+
{
70+
switch (kv.second.DataType)
71+
{
72+
case ShaderDataType::Float: MH_SER_ASSERT(read_value<&Material::SetFloat, float>(stream, *material, kv.first)); break;
73+
case ShaderDataType::Float2: MH_SER_ASSERT(read_value<&Material::SetFloat2, glm::vec2>(stream, *material, kv.first)); break;
74+
case ShaderDataType::Float3: MH_SER_ASSERT(read_value<&Material::SetFloat3, glm::vec3>(stream, *material, kv.first)); break;
75+
case ShaderDataType::Float4: MH_SER_ASSERT(read_value<&Material::SetFloat4, glm::vec4>(stream, *material, kv.first)); break;
76+
case ShaderDataType::Mat3: MH_SER_ASSERT(read_value<&Material::SetMat3, glm::mat3>(stream, *material, kv.first)); break;
77+
case ShaderDataType::Mat4: MH_SER_ASSERT(read_value<&Material::SetMat4, glm::mat4>(stream, *material, kv.first)); break;
78+
case ShaderDataType::Int: MH_SER_ASSERT(read_value<&Material::SetInt, int32_t>(stream, *material, kv.first)); break;
79+
case ShaderDataType::Sampler2D:
80+
case ShaderDataType::SamplerCube:
81+
{
82+
Asset<Texture> texture;
83+
MH_SER_ASSERT(stream.serialize(texture));
84+
material->SetTexture(kv.first, 0, texture);
85+
break;
86+
}
87+
default: break;
88+
}
89+
}
90+
}
91+
92+
return true;
93+
}
94+
};
95+
}

0 commit comments

Comments
 (0)