Skip to content

Commit 05b5c7c

Browse files
committed
Updated static mesh serialisation to use binary serialiser
1 parent 134cd4a commit 05b5c7c

File tree

5 files changed

+77
-62
lines changed

5 files changed

+77
-62
lines changed

engine/render/renderer/platform/vulkan/StaticMesh.cpp

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,11 @@
1111

1212
#include <resources/PackFile.h>
1313
#include <resources/ResourceSystem.h>
14+
#include <resources/PackFileData.h>
15+
#include <resources/StaticMeshData.h>
1416
#include <utils/Logging.h>
1517

1618
#include "Swapchain.h"
17-
#include "resources/StaticMeshData.h"
1819

1920
namespace Siege::Vulkan
2021
{
@@ -43,22 +44,31 @@ StaticMesh::StaticMesh(const char* filePath, Material* material)
4344
{
4445
// TODO(Aryeh): How to extract material data from object files?
4546
PackFile* packFile = ResourceSystem::GetInstance().GetPackFile();
46-
std::shared_ptr<StaticMeshData> vertexData = packFile->FindData<StaticMeshData>(filePath);
47+
std::shared_ptr<PackFileData> vertexDataDataBuffer = packFile->FindData<PackFileData>(filePath);
4748

48-
CC_ASSERT(vertexData->verticesCount > 0, "Cannot load in a file with no vertices!")
49-
CC_ASSERT(vertexData->indicesCount > 0, "Cannot load in a file with no indices!")
49+
BinarySerialisation::Buffer buffer;
50+
uint8_t* data = reinterpret_cast<uint8_t*>(vertexDataDataBuffer->data);
51+
size_t dataSize = vertexDataDataBuffer->dataSize;
52+
buffer.data.assign(data, dataSize);
5053

51-
CC_ASSERT(vertexData->verticesCount < MAX_VERTICES, "The provided model has too many vertices!")
52-
CC_ASSERT(vertexData->indicesCount < MAX_INDICES, "The provided model has too many indices!")
54+
// TODO - Fold into resource system
55+
StaticMeshData staticMeshData;
56+
staticMeshData.serialise(buffer, BinarySerialisation::DESERIALISE);
5357

54-
vertexBuffer = VertexBuffer(sizeof(BaseVertex) * vertexData->verticesCount);
55-
vertexBuffer.Copy(vertexData->GetVertices(), sizeof(BaseVertex) * vertexData->verticesCount);
58+
CC_ASSERT(!staticMeshData.vertices.empty(), "Cannot load in a file with no vertices!")
59+
CC_ASSERT(!staticMeshData.indices.empty(), "Cannot load in a file with no indices!")
5660

57-
indexBuffer = IndexBuffer(sizeof(unsigned int) * vertexData->indicesCount);
58-
indexBuffer.Copy(vertexData->GetIndices(), sizeof(unsigned int) * vertexData->indicesCount);
61+
CC_ASSERT(staticMeshData.vertices.size() < MAX_VERTICES, "The provided model has too many vertices!")
62+
CC_ASSERT(staticMeshData.indices.size() < MAX_INDICES, "The provided model has too many indices!")
5963

60-
vertexCount = vertexData->verticesCount;
61-
indexCount = vertexData->indicesCount;
64+
vertexCount = staticMeshData.vertices.size();
65+
indexCount = staticMeshData.indices.size();
66+
67+
vertexBuffer = VertexBuffer(sizeof(BaseVertex) * vertexCount);
68+
vertexBuffer.Copy(staticMeshData.vertices.data(), sizeof(BaseVertex) * vertexCount);
69+
70+
indexBuffer = IndexBuffer(sizeof(unsigned int) * indexCount);
71+
indexBuffer.Copy(staticMeshData.indices.data(), sizeof(unsigned int) * indexCount);
6272

6373
subMeshes = MHArray<SubMesh>(1);
6474
materials = MHArray<Material*>(1);

engine/resources/StaticMeshData.h

Lines changed: 14 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include <utils/math/vec/Hashing.h>
1515
#include <utils/math/vec/Vec2.h>
1616
#include <utils/math/vec/Vec3.h>
17+
#include <utils/BinarySerialisation.h>
1718

1819
#include "PackFile.h"
1920

@@ -39,50 +40,25 @@ inline bool operator!=(const BaseVertex& left, const BaseVertex& right)
3940
return !(left == right);
4041
}
4142

42-
#pragma pack(push, 1)
43-
struct StaticMeshData
43+
inline void serialise(BinarySerialisation::Buffer& buffer, BaseVertex& value, BinarySerialisation::SerialisationMode mode)
4444
{
45-
uint64_t indicesCount = 0;
46-
uint64_t verticesCount = 0;
47-
char data[];
48-
49-
uint32_t* GetIndices() const
50-
{
51-
return (uint32_t*) data;
52-
}
53-
54-
BaseVertex* GetVertices() const
55-
{
56-
return (BaseVertex*) (data + sizeof(uint32_t) * indicesCount);
57-
}
58-
59-
static StaticMeshData* Create(const std::vector<uint32_t>& objIndices,
60-
const std::vector<BaseVertex>& objVertices)
61-
{
62-
uint32_t indicesDataSize = sizeof(uint32_t) * objIndices.size();
63-
uint32_t verticesDataSize = sizeof(BaseVertex) * objVertices.size();
64-
uint32_t totalDataSize = sizeof(StaticMeshData) + indicesDataSize + verticesDataSize;
65-
66-
void* mem = malloc(totalDataSize);
67-
StaticMeshData* staticMeshData = new (mem) StaticMeshData();
68-
69-
staticMeshData->indicesCount = objIndices.size();
70-
staticMeshData->verticesCount = objVertices.size();
71-
memcpy(&staticMeshData->data[0], objIndices.data(), indicesDataSize);
72-
memcpy(&staticMeshData->data[0] + indicesDataSize, objVertices.data(), verticesDataSize);
45+
serialise(buffer, value.position, mode);
46+
serialise(buffer, value.color, mode);
47+
serialise(buffer, value.normal, mode);
48+
serialise(buffer, value.uv, mode);
49+
}
7350

74-
return staticMeshData;
75-
}
51+
struct StaticMeshData : BinarySerialisation::BinarySerialisable
52+
{
53+
std::vector<uint32_t> indices;
54+
std::vector<BaseVertex> vertices;
7655

77-
static uint32_t GetDataSize(void* objectData)
56+
void serialise(BinarySerialisation::Buffer& buffer, BinarySerialisation::SerialisationMode mode) override
7857
{
79-
if (!objectData) return 0;
80-
StaticMeshData* staticMeshData = reinterpret_cast<StaticMeshData*>(objectData);
81-
return sizeof(StaticMeshData) + sizeof(uint32_t) * staticMeshData->indicesCount +
82-
sizeof(BaseVertex) * staticMeshData->verticesCount;
58+
BinarySerialisation::serialise(buffer, indices, mode);
59+
BinarySerialisation::serialise(buffer, vertices, mode);
8360
}
8461
};
85-
#pragma pack(pop)
8662

8763
} // namespace Siege
8864

engine/utils/BinarySerialisation.h

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@
1414
#include <set>
1515
#include <vector>
1616

17+
#include "math/vec/Vec.h"
18+
#include "math/vec/Vec2.h"
19+
#include "math/vec/Vec3.h"
20+
#include "Colour.h"
1721
#include "String.h"
1822

1923
namespace Siege::BinarySerialisation
@@ -108,9 +112,29 @@ void serialiseContainer(Buffer& buffer, T& value)
108112
}
109113
}
110114

111-
inline void serialise(Buffer& buffer, String& value, SerialisationMode mode)
115+
inline void serialise(Buffer& buffer, Vec2& value, SerialisationMode mode)
116+
{
117+
serialiseNative(buffer, value.x, mode);
118+
serialiseNative(buffer, value.y, mode);
119+
}
120+
121+
inline void serialise(Buffer& buffer, Vec3& value, SerialisationMode mode)
122+
{
123+
serialiseNative(buffer, value.x, mode);
124+
serialiseNative(buffer, value.y, mode);
125+
serialiseNative(buffer, value.z, mode);
126+
}
127+
128+
inline void serialise(Buffer& buffer, FColour& value, SerialisationMode mode)
112129
{
130+
serialiseNative(buffer, value.r, mode);
131+
serialiseNative(buffer, value.g, mode);
132+
serialiseNative(buffer, value.b, mode);
133+
serialiseNative(buffer, value.a, mode);
134+
}
113135

136+
inline void serialise(Buffer& buffer, String& value, SerialisationMode mode)
137+
{
114138
switch (mode)
115139
{
116140
case SERIALISE:

packer/src/types/StaticMeshDataPacker.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
#include <assimp/postprocess.h>
1313
#include <assimp/scene.h>
1414
#include <resources/StaticMeshData.h>
15+
#include <resources/PackFileData.h>
16+
#include <utils/BinarySerialisation.h>
1517
#include <utils/FileSystem.h>
1618
#include <utils/Logging.h>
1719

@@ -208,11 +210,15 @@ void* PackStaticMeshFile(const Siege::String& filePath, const Siege::String& ass
208210
}
209211
}
210212

211-
std::vector<Siege::BaseVertex> vertices;
212-
std::vector<uint32_t> indices;
213-
GetMeshesForNode(scene, scene->mRootNode, requestedNodePath, '/', baseXform, vertices, indices);
213+
Siege::StaticMeshData staticMeshData;
214+
GetMeshesForNode(scene, scene->mRootNode, requestedNodePath, '/', baseXform, staticMeshData.vertices, staticMeshData.indices);
214215

215-
Siege::StaticMeshData* staticMeshData = Siege::StaticMeshData::Create(indices, vertices);
216-
fileSize = Siege::StaticMeshData::GetDataSize(staticMeshData);
217-
return staticMeshData;
216+
Siege::BinarySerialisation::Buffer dataBuffer;
217+
staticMeshData.serialise(dataBuffer, Siege::BinarySerialisation::SERIALISE);
218+
219+
fileSize = dataBuffer.data.size();
220+
char* data = reinterpret_cast<char*>(dataBuffer.data.data());
221+
222+
Siege::PackFileData* fileData = Siege::PackFileData::Create(data, fileSize);
223+
return fileData;
218224
}

tests/src/resources/test_ResourceSystem.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -100,13 +100,12 @@ UTEST_F(test_ResourceSystem, LoadStaticMeshData)
100100

101101
std::shared_ptr<StaticMeshData> data = packFile->FindData<StaticMeshData>("assets/cube.sm");
102102
ASSERT_TRUE(data);
103-
ASSERT_EQ(36, data->indicesCount);
104-
ASSERT_EQ(24, data->verticesCount);
105-
ASSERT_EQ(1312, StaticMeshData::GetDataSize(data.get()));
103+
ASSERT_EQ(36, data->indices.size());
104+
ASSERT_EQ(24, data->vertices.size());
106105

107106
uint32_t expectedIndices[36] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
108107
0, 18, 1, 3, 19, 4, 6, 20, 7, 9, 21, 10, 12, 22, 13, 15, 23, 16};
109-
uint32_t* actualIndices = data->GetIndices();
108+
uint32_t* actualIndices = data->indices.data();
110109
ASSERT_TRUE(actualIndices);
111110

112111
bool indicesCorrect = true;
@@ -143,7 +142,7 @@ UTEST_F(test_ResourceSystem, LoadStaticMeshData)
143142
{{1, 1, -1}, {1, 1, 1, 1}, {0, 1, 0}, {0.375, 0.75}},
144143
{{1, -1, -1}, {1, 1, 1, 1}, {1, 0, 0}, {0.625, 0.75}},
145144
{{1, -1, 1}, {1, 1, 1, 1}, {0, 0, 1}, {0.625, 0.5}}};
146-
BaseVertex* actualVertices = data->GetVertices();
145+
BaseVertex* actualVertices = data->vertices.data();
147146
ASSERT_TRUE(actualVertices);
148147

149148
bool verticesCorrect = true;

0 commit comments

Comments
 (0)