16
16
#include < utils/Logging.h>
17
17
18
18
#include < fstream>
19
+ #include < zlib.h>
19
20
20
21
#include " types/GenericFileDataPacker.h"
21
22
#include " types/SceneDataPacker.h"
@@ -43,18 +44,11 @@ int main(int argc, char* argv[])
43
44
inputFiles.emplace_back (argv[currentArg]);
44
45
}
45
46
46
- uint32_t dataSize = 0 ;
47
- uint32_t entriesSize = 0 ;
48
-
49
- struct BodyDataEntry
50
- {
51
- void * ptr;
52
- uint32_t size;
53
- };
47
+ uint32_t entriesDataSize = 0 ;
48
+ uint32_t entriesTocSize = 0 ;
54
49
55
50
std::vector<void *> dynamicAllocations;
56
- std::vector<PackFile::TocEntry*> tocEntries;
57
- std::vector<BodyDataEntry> bodyDataEntries;
51
+ std::vector<std::pair<PackFile::TocEntry*, void *>> entries;
58
52
for (auto & file : inputFiles)
59
53
{
60
54
if (file.empty ()) continue ;
@@ -93,22 +87,21 @@ int main(int argc, char* argv[])
93
87
}
94
88
95
89
PackFile::TocEntry* tocEntry =
96
- PackFile::TocEntry::Create (file.c_str (), dataSize , bodyDataSize);
90
+ PackFile::TocEntry::Create (file.c_str (), entriesDataSize , bodyDataSize);
97
91
98
- bodyDataEntries.push_back ({data, bodyDataSize});
99
- tocEntries.push_back (tocEntry);
92
+ entries.emplace_back (tocEntry, data);
100
93
101
- dataSize += bodyDataSize;
102
- entriesSize += tocEntry->GetDataSize ();
94
+ entriesDataSize += bodyDataSize;
95
+ entriesTocSize += tocEntry->GetDataSize ();
103
96
104
97
dynamicAllocations.push_back (data);
105
98
dynamicAllocations.push_back (tocEntry);
106
99
}
107
100
108
101
PackFile::Header header {{PACKER_MAGIC_NUMBER_FILE},
109
102
PACKER_FILE_VERSION,
110
- dataSize + PACKER_MAGIC_NUMBER_SIZE + entriesSize ,
111
- dataSize };
103
+ entriesDataSize + PACKER_MAGIC_NUMBER_SIZE + entriesTocSize ,
104
+ entriesDataSize };
112
105
113
106
CC_LOG_INFO (
114
107
" Beginning pack file version {} write process for body size {} and ToC offset of {}..." ,
@@ -127,16 +120,28 @@ int main(int argc, char* argv[])
127
120
sizeof (PackFile::Header),
128
121
writeTotal)
129
122
130
- for (auto entry : bodyDataEntries)
123
+ entriesDataSize = 0 ;
124
+ for (const std::pair<PackFile::TocEntry*, void *>& entry : entries)
131
125
{
132
- uint32_t bodyDataSize = entry.size ;
133
- outputFileStream.write (reinterpret_cast <char *>(entry.ptr ), bodyDataSize);
134
- writeTotal += bodyDataSize;
135
- CC_LOG_INFO (" Adding DATA (offset: {}) to pack file with size: {} (write total: {})" ,
136
- dataOffset,
137
- bodyDataSize,
126
+ uLongf bodyDataSizeUncompressed = entry.first ->dataSize ;
127
+ uLongf bodyDataSizeCompressed = compressBound (bodyDataSizeUncompressed);
128
+
129
+ Bytef bodyDataBufferCompressed[bodyDataSizeCompressed];
130
+ int result = compress2 (bodyDataBufferCompressed, &bodyDataSizeCompressed,
131
+ static_cast <Bytef*>(entry.second ), bodyDataSizeUncompressed, Z_BEST_COMPRESSION);
132
+ CC_ASSERT (result == Z_OK, " Compression failed for entry: " + Siege::String (entry.first ->name ));
133
+
134
+ outputFileStream.write (reinterpret_cast <char *>(bodyDataBufferCompressed), static_cast <long >(bodyDataSizeCompressed));
135
+ entry.first ->dataOffset = entriesDataSize;
136
+ entry.first ->dataSizeCompressed = bodyDataSizeCompressed;
137
+ writeTotal += bodyDataSizeCompressed;
138
+ entriesDataSize += bodyDataSizeCompressed;
139
+ CC_LOG_INFO (" Adding DATA \" {}\" to pack file with size: {}, compressed to {}% (write total: {})" ,
140
+ entry.first ->name ,
141
+ bodyDataSizeCompressed,
142
+ static_cast <uint8_t >(static_cast <float >(bodyDataSizeCompressed) / static_cast <float >(bodyDataSizeUncompressed) * 100 .f ),
138
143
writeTotal)
139
- dataOffset += bodyDataSize ;
144
+ dataOffset += bodyDataSizeCompressed ;
140
145
}
141
146
142
147
outputFileStream.write (PACKER_MAGIC_NUMBER_TOC, PACKER_MAGIC_NUMBER_SIZE);
@@ -145,18 +150,23 @@ int main(int argc, char* argv[])
145
150
PACKER_MAGIC_NUMBER_SIZE,
146
151
writeTotal)
147
152
148
- for (Siege:: PackFile::TocEntry* toc : tocEntries )
153
+ for (const std::pair< PackFile::TocEntry*, void *>& entry : entries )
149
154
{
150
- outputFileStream.write (reinterpret_cast <char *>(toc ), toc ->GetDataSize ());
151
- writeTotal += toc ->GetDataSize ();
155
+ outputFileStream.write (reinterpret_cast <char *>(entry. first ), entry. first ->GetDataSize ());
156
+ writeTotal += entry. first ->GetDataSize ();
152
157
CC_LOG_INFO (
153
- " Adding TOC ENTRY \" {}\" (offset: {}) to pack file with size: {} (write total: {})" ,
154
- toc ->name ,
155
- toc ->dataOffset ,
156
- toc ->GetDataSize (),
158
+ " Adding TOC \" {}\" (offset: {}) to pack file with size: {} (write total: {})" ,
159
+ entry. first ->name ,
160
+ entry. first ->dataOffset ,
161
+ entry. first ->GetDataSize (),
157
162
writeTotal)
158
163
}
159
164
165
+ header.bodySize = entriesDataSize + PACKER_MAGIC_NUMBER_SIZE + entriesTocSize;
166
+ header.tocOffset = entriesDataSize;
167
+ outputFileStream.seekp (0 );
168
+ outputFileStream.write (reinterpret_cast <char *>(&header), sizeof (PackFile::Header));
169
+
160
170
outputFileStream.close ();
161
171
CC_LOG_INFO (" Ended pack file write process (write total: {})" , writeTotal)
162
172
@@ -176,7 +186,6 @@ int main(int argc, char* argv[])
176
186
{
177
187
CC_LOG_WARNING (" Missing ToC entry for input file \" {}\" " , file.c_str ())
178
188
errors = true ;
179
- continue ;
180
189
}
181
190
}
182
191
0 commit comments