2
* Copyright 2010 Inalogic® Inc.
4
* This program is free software: you can redistribute it and/or modify it
5
* under the terms of the GNU Lesser General Public License, as
6
* published by the Free Software Foundation; either version 2.1 or 3.0
9
* This program is distributed in the hope that it will be useful, but
10
* WITHOUT ANY WARRANTY; without even the implied warranties of
11
* MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
12
* PURPOSE. See the applicable version of the GNU Lesser General Public
13
* License for more details.
15
* You should have received a copy of both the GNU Lesser General Public
16
* License along with this program. If not, see <http://www.gnu.org/licenses/>
18
* Authored by: Jay Taoko <jaytaoko@inalogic.com>
23
#include "NuxCore/NuxCore.h"
25
#include "NuxCore/FilePath.h"
26
#include "NWorldArchiveManager.h"
27
#include "NMeshArchiver_ver_0_0_1.h"
28
#include "NMeshObject.h"
34
NWorldArchiveManager::NWorldArchiveManager()
38
NWorldArchiveManager::~NWorldArchiveManager()
42
bool NWorldArchiveManager::SaveWorldArchiveFile (const TCHAR *WorldArchiveFilename, N3DWorld *World)
47
#define CHECK_WORLD_WRITE_ERROR /*if(m_FileStream.bad()) {m_FileStream->close(); nuxAssertMsg(0, TEXT("[CreateTextureArchiveFile] Write Error.")); return false;}*/
49
m_FileStream = GFileManager.CreateFileWriter (TCHAR_TO_ANSI (WorldArchiveFilename), nux::NSerializer::Read | nux::NSerializer::Write);
53
nuxAssertMsg (0, TEXT ("[SaveWorldArchiveFile] Can't open file: %s"), WorldArchiveFilename);
58
m_FileStream->Seek (0, nux::NSerializer::SeekStart);
59
unsigned int ArchiveTag = WORLDARCHIVE_TAG;
60
unsigned int ArchiveFormatVersion = WORLDARCHIVE_VERSION;
61
m_NumberOfObjects = 0;
62
nux::TimeStamp time_stamp;
65
m_FileStream->Serialize ( (char *) &ArchiveTag, sizeof (ArchiveTag) );
66
CHECK_WORLD_WRITE_ERROR;
67
m_FileStream->Serialize ( (char *) &ArchiveFormatVersion, sizeof (ArchiveFormatVersion) );
68
CHECK_WORLD_WRITE_ERROR;
71
m_FileStream->Serialize ( (char *) &time_stamp.m_Year, sizeof (time_stamp.m_Year) );
72
CHECK_WORLD_WRITE_ERROR;
73
m_FileStream->Serialize ( (char *) &time_stamp.m_Month, sizeof (time_stamp.m_Month) );
74
CHECK_WORLD_WRITE_ERROR;
75
m_FileStream->Serialize ( (char *) &time_stamp.m_Day, sizeof (time_stamp.m_Day) );
76
CHECK_WORLD_WRITE_ERROR;
77
m_FileStream->Serialize ( (char *) &time_stamp.m_Hour, sizeof (time_stamp.m_Hour) );
78
CHECK_WORLD_WRITE_ERROR;
79
m_FileStream->Serialize ( (char *) &time_stamp.m_Minute, sizeof (time_stamp.m_Minute) );
80
CHECK_WORLD_WRITE_ERROR;
81
m_FileStream->Serialize ( (char *) &time_stamp.m_Second, sizeof (time_stamp.m_Second) );
82
CHECK_WORLD_WRITE_ERROR;
83
m_FileStream->Serialize ( (char *) &time_stamp.m_MicroSecond, sizeof (time_stamp.m_MicroSecond) );
84
CHECK_WORLD_WRITE_ERROR;
87
m_FileStream->Serialize ( (char *) &time_stamp.m_Year, sizeof (time_stamp.m_Year) );
88
CHECK_WORLD_WRITE_ERROR;
89
m_FileStream->Serialize ( (char *) &time_stamp.m_Month, sizeof (time_stamp.m_Month) );
90
CHECK_WORLD_WRITE_ERROR;
91
m_FileStream->Serialize ( (char *) &time_stamp.m_Day, sizeof (time_stamp.m_Day) );
92
CHECK_WORLD_WRITE_ERROR;
93
m_FileStream->Serialize ( (char *) &time_stamp.m_Hour, sizeof (time_stamp.m_Hour) );
94
CHECK_WORLD_WRITE_ERROR;
95
m_FileStream->Serialize ( (char *) &time_stamp.m_Minute, sizeof (time_stamp.m_Minute) );
96
CHECK_WORLD_WRITE_ERROR;
97
m_FileStream->Serialize ( (char *) &time_stamp.m_Second, sizeof (time_stamp.m_Second) );
98
CHECK_WORLD_WRITE_ERROR;
99
m_FileStream->Serialize ( (char *) &time_stamp.m_MicroSecond, sizeof (time_stamp.m_MicroSecond) );
100
CHECK_WORLD_WRITE_ERROR;
102
// Number of Textures in the archives
103
m_FileStream->Serialize ( (char *) &m_NumberOfObjects, sizeof (m_NumberOfObjects) );
104
CHECK_WORLD_WRITE_ERROR;
106
int NumMesh = World->NumMesh();
108
for (int i = 0; i < NumMesh; i++)
110
ObjectType objecttype = OBJECTTYPE_MESH;
111
m_FileStream->Serialize ( (char *) &objecttype, sizeof (objecttype) );
112
SaveMeshObject_ver_0_0_1 (m_FileStream, World->GetMesh (i) );
115
unsigned int ArchiveEndTag = WORLDARCHIVE_END_TAG;
116
m_FileStream->Serialize ( (char *) &ArchiveEndTag, sizeof (ArchiveEndTag) );
117
m_FileStream->Close();
119
#undef CHECK_WORLD_WRITE_ERROR
124
N3DWorld *NWorldArchiveManager::LoadWorldArchiveFile (const TCHAR *WorldArchiveFilename)
126
#define CHECK_WORLD_READ_ERROR /*if(m_FileStream.bad()) {m_FileStream->close(); nuxAssertMsg(0, TEXT("[CreateTextureArchiveFile] Write Error.")); return false;}*/
128
m_FileStream = GFileManager.CreateFileReader (TCHAR_TO_ANSI (WorldArchiveFilename), nux::NSerializer::Read | nux::NSerializer::Write);
132
nuxAssertMsg (0, TEXT ("[LoadWorldArchiveFile] Can't open file: %s"), WorldArchiveFilename);
136
m_FileStream->Seek (0, nux::NSerializer::SeekStart);
137
unsigned int ArchiveTag = 0;
138
unsigned int ArchiveFormatVersion = 0;
139
m_NumberOfObjects = 0;
140
nux::TimeStamp time_stamp;
142
m_FileStream->Serialize ( (char *) &ArchiveTag, sizeof (ArchiveTag) );
143
CHECK_WORLD_READ_ERROR;
144
m_FileStream->Serialize ( (char *) &ArchiveFormatVersion, sizeof (ArchiveFormatVersion) );
145
CHECK_WORLD_READ_ERROR;
147
if (ArchiveTag != WORLDARCHIVE_TAG)
149
m_FileStream->Close();
154
m_FileStream->Serialize ( (char *) &time_stamp.m_Year, sizeof (time_stamp.m_Year) );
155
CHECK_WORLD_READ_ERROR;
156
m_FileStream->Serialize ( (char *) &time_stamp.m_Month, sizeof (time_stamp.m_Month) );
157
CHECK_WORLD_READ_ERROR;
158
m_FileStream->Serialize ( (char *) &time_stamp.m_Day, sizeof (time_stamp.m_Day) );
159
CHECK_WORLD_READ_ERROR;
160
m_FileStream->Serialize ( (char *) &time_stamp.m_Hour, sizeof (time_stamp.m_Hour) );
161
CHECK_WORLD_READ_ERROR;
162
m_FileStream->Serialize ( (char *) &time_stamp.m_Minute, sizeof (time_stamp.m_Minute) );
163
CHECK_WORLD_READ_ERROR;
164
m_FileStream->Serialize ( (char *) &time_stamp.m_Second, sizeof (time_stamp.m_Second) );
165
CHECK_WORLD_READ_ERROR;
166
m_FileStream->Serialize ( (char *) &time_stamp.m_MicroSecond, sizeof (time_stamp.m_MicroSecond) );
167
CHECK_WORLD_READ_ERROR;
170
m_FileStream->Serialize ( (char *) &time_stamp.m_Year, sizeof (time_stamp.m_Year) );
171
CHECK_WORLD_READ_ERROR;
172
m_FileStream->Serialize ( (char *) &time_stamp.m_Month, sizeof (time_stamp.m_Month) );
173
CHECK_WORLD_READ_ERROR;
174
m_FileStream->Serialize ( (char *) &time_stamp.m_Day, sizeof (time_stamp.m_Day) );
175
CHECK_WORLD_READ_ERROR;
176
m_FileStream->Serialize ( (char *) &time_stamp.m_Hour, sizeof (time_stamp.m_Hour) );
177
CHECK_WORLD_READ_ERROR;
178
m_FileStream->Serialize ( (char *) &time_stamp.m_Minute, sizeof (time_stamp.m_Minute) );
179
CHECK_WORLD_READ_ERROR;
180
m_FileStream->Serialize ( (char *) &time_stamp.m_Second, sizeof (time_stamp.m_Second) );
181
CHECK_WORLD_READ_ERROR;
182
m_FileStream->Serialize ( (char *) &time_stamp.m_MicroSecond, sizeof (time_stamp.m_MicroSecond) );
183
CHECK_WORLD_READ_ERROR;
185
// Number of Textures in the archives
186
m_FileStream->Serialize ( (char *) &m_NumberOfObjects, sizeof (m_NumberOfObjects) );
187
CHECK_WORLD_READ_ERROR;
190
N3DWorld *World = new N3DWorld();
192
ObjectType objecttype;
194
m_FileStream->Serialize ( (char *) &tag, sizeof (tag) );
198
objecttype = ObjectType (tag);
199
t_s64 filepos = m_FileStream->Tell();
201
if (objecttype == OBJECTTYPE_MESH)
203
NMeshObject *mesh = LoadMeshObject_ver_0_0_1 (m_FileStream, filepos);
207
mesh->CreateGLObjects();
208
World->AddMeshObject (mesh);
212
m_FileStream->Serialize ( (char *) &tag, sizeof (tag) );
215
m_FileStream->Close();
221
bool NWorldArchiveManager::SaveStaticMeshFile (const TCHAR *MeshFilename, NMeshObject *Mesh, unsigned int Flags)
226
#define CHECK_WORLD_WRITE_ERROR /*if(m_FileStream.bad()) {m_FileStream->close(); nuxAssertMsg(0, TEXT("[CreateTextureArchiveFile] Write Error.")); return false;}*/
228
m_FileStream = GFileManager.CreateFileWriter (TCHAR_TO_ANSI (MeshFilename), Flags | nux::NSerializer::Read | nux::NSerializer::Write);
232
nuxAssertMsg (0, TEXT ("[SaveStaticMeshFile] Can't open file: %s"), MeshFilename);
237
m_FileStream->Seek (0, nux::NSerializer::SeekStart);
238
unsigned int ArchiveTag = STATICMESHARCHIVE_TAG;
239
unsigned int ArchiveFormatVersion = STATICMESHARCHIVE_VERSION;
240
nux::TimeStamp time_stamp;
241
time_stamp.GetTime();
243
m_FileStream->Serialize ( (char *) &ArchiveTag, sizeof (ArchiveTag) );
244
CHECK_WORLD_WRITE_ERROR;
245
m_FileStream->Serialize ( (char *) &ArchiveFormatVersion, sizeof (ArchiveFormatVersion) );
246
CHECK_WORLD_WRITE_ERROR;
249
m_FileStream->Serialize ( (char *) &time_stamp.m_Year, sizeof (time_stamp.m_Year) );
250
CHECK_WORLD_WRITE_ERROR;
251
m_FileStream->Serialize ( (char *) &time_stamp.m_Month, sizeof (time_stamp.m_Month) );
252
CHECK_WORLD_WRITE_ERROR;
253
m_FileStream->Serialize ( (char *) &time_stamp.m_Day, sizeof (time_stamp.m_Day) );
254
CHECK_WORLD_WRITE_ERROR;
255
m_FileStream->Serialize ( (char *) &time_stamp.m_Hour, sizeof (time_stamp.m_Hour) );
256
CHECK_WORLD_WRITE_ERROR;
257
m_FileStream->Serialize ( (char *) &time_stamp.m_Minute, sizeof (time_stamp.m_Minute) );
258
CHECK_WORLD_WRITE_ERROR;
259
m_FileStream->Serialize ( (char *) &time_stamp.m_Second, sizeof (time_stamp.m_Second) );
260
CHECK_WORLD_WRITE_ERROR;
261
m_FileStream->Serialize ( (char *) &time_stamp.m_MicroSecond, sizeof (time_stamp.m_MicroSecond) );
262
CHECK_WORLD_WRITE_ERROR;
265
m_FileStream->Serialize ( (char *) &time_stamp.m_Year, sizeof (time_stamp.m_Year) );
266
CHECK_WORLD_WRITE_ERROR;
267
m_FileStream->Serialize ( (char *) &time_stamp.m_Month, sizeof (time_stamp.m_Month) );
268
CHECK_WORLD_WRITE_ERROR;
269
m_FileStream->Serialize ( (char *) &time_stamp.m_Day, sizeof (time_stamp.m_Day) );
270
CHECK_WORLD_WRITE_ERROR;
271
m_FileStream->Serialize ( (char *) &time_stamp.m_Hour, sizeof (time_stamp.m_Hour) );
272
CHECK_WORLD_WRITE_ERROR;
273
m_FileStream->Serialize ( (char *) &time_stamp.m_Minute, sizeof (time_stamp.m_Minute) );
274
CHECK_WORLD_WRITE_ERROR;
275
m_FileStream->Serialize ( (char *) &time_stamp.m_Second, sizeof (time_stamp.m_Second) );
276
CHECK_WORLD_WRITE_ERROR;
277
m_FileStream->Serialize ( (char *) &time_stamp.m_MicroSecond, sizeof (time_stamp.m_MicroSecond) );
278
CHECK_WORLD_WRITE_ERROR;
281
ObjectType objecttype = OBJECTTYPE_MESH;
282
m_FileStream->Serialize ( (char *) &objecttype, sizeof (objecttype) );
283
SaveMeshObject_ver_0_0_1 (m_FileStream, Mesh);
285
unsigned int ArchiveEndTag = STATICMESHARCHIVE_END_TAG;
286
m_FileStream->Serialize ( (char *) &ArchiveEndTag, sizeof (ArchiveEndTag) );
287
m_FileStream->Close();
289
#undef CHECK_WORLD_WRITE_ERROR
294
NMeshObject *NWorldArchiveManager::LoadStaticMeshFile (const TCHAR *MeshFilename)
296
m_FileStream = GFileManager.CreateFileReader (TCHAR_TO_ANSI (MeshFilename), nux::NSerializer::Read | nux::NSerializer::Write);
300
nuxAssertMsg (0, TEXT ("[LoadStaticMeshFile] Can't open file: %s"), MeshFilename);
304
m_FileStream->Seek (0, nux::NSerializer::SeekStart);
305
unsigned int ArchiveTag = 0;
306
unsigned int ArchiveFormatVersion = 0;
307
m_NumberOfObjects = 0;
308
nux::TimeStamp time_stamp;
310
m_FileStream->Serialize ( (char *) &ArchiveTag, sizeof (ArchiveTag) );
311
m_FileStream->Serialize ( (char *) &ArchiveFormatVersion, sizeof (ArchiveFormatVersion) );
313
if (ArchiveTag != STATICMESHARCHIVE_TAG)
315
m_FileStream->Close();
320
m_FileStream->Serialize ( (char *) &time_stamp.m_Year, sizeof (time_stamp.m_Year) );
321
m_FileStream->Serialize ( (char *) &time_stamp.m_Month, sizeof (time_stamp.m_Month) );
322
m_FileStream->Serialize ( (char *) &time_stamp.m_Day, sizeof (time_stamp.m_Day) );
323
m_FileStream->Serialize ( (char *) &time_stamp.m_Hour, sizeof (time_stamp.m_Hour) );
324
m_FileStream->Serialize ( (char *) &time_stamp.m_Minute, sizeof (time_stamp.m_Minute) );
325
m_FileStream->Serialize ( (char *) &time_stamp.m_Second, sizeof (time_stamp.m_Second) );
326
m_FileStream->Serialize ( (char *) &time_stamp.m_MicroSecond, sizeof (time_stamp.m_MicroSecond) );
329
m_FileStream->Serialize ( (char *) &time_stamp.m_Year, sizeof (time_stamp.m_Year) );
330
m_FileStream->Serialize ( (char *) &time_stamp.m_Month, sizeof (time_stamp.m_Month) );
331
m_FileStream->Serialize ( (char *) &time_stamp.m_Day, sizeof (time_stamp.m_Day) );
332
m_FileStream->Serialize ( (char *) &time_stamp.m_Hour, sizeof (time_stamp.m_Hour) );
333
m_FileStream->Serialize ( (char *) &time_stamp.m_Minute, sizeof (time_stamp.m_Minute) );
334
m_FileStream->Serialize ( (char *) &time_stamp.m_Second, sizeof (time_stamp.m_Second) );
335
m_FileStream->Serialize ( (char *) &time_stamp.m_MicroSecond, sizeof (time_stamp.m_MicroSecond) );
337
NMeshObject *Mesh = 0;
338
ObjectType objecttype;
339
m_FileStream->Serialize ( (char *) &objecttype, sizeof (objecttype) );
341
bool MeshExtracted = false;
343
if (objecttype == OBJECTTYPE_MESH)
345
t_s64 filepos = m_FileStream->Tell();
346
Mesh = LoadMeshObject_ver_0_0_1 (m_FileStream, filepos);
350
Mesh->CreateGLObjects();
353
MeshExtracted = true;
357
nuxAssertMsg (0, TEXT ("[LoadStaticMeshFile] Can't extract static mesh from mesh archive: %s"), MeshFilename);
360
m_FileStream->Close();
362
if (MeshExtracted == false)