23
#include "NuxCore/NKernel.h"
25
#include "NuxCore/FilePath.h"
26
#include "NuxImage/Tga.h"
27
#include "NuxImage/ImageSurface.h"
28
#include "NuxImage/NITX.h"
29
#include "NTextureArchiveManager.h"
31
#include "NuxCore/TinyXML/tinyxml.h"
35
bool IsUITextureArchive(const TCHAR* ArchiveFileName)
37
NSerializer* fileStream = GFileManager.CreateFileReader(ArchiveFileName, NSerializer::Read|NSerializer::Write);
39
fileStream->Seek(0, NSerializer::SeekStart);
42
fileStream->Serialize((char*) &FileTag, sizeof(FileTag));
45
if(FileTag != UITEXTUREARCHIVETAG)
52
NUITextureArchiver::NUITextureArchiver(const TCHAR* ArchiveFileName)
54
if(IsUITextureArchive(ArchiveFileName))
55
LoadUIArchive(ArchiveFileName, m_ArchiveTextureArray);
58
NUITextureArchiver::~NUITextureArchiver()
60
int num = m_ArchiveTextureArray.size();
61
for(int n = 0; n < num; n++)
63
delete m_ArchiveTextureArray[n]->TextureData;
64
delete m_ArchiveTextureArray[n];
66
m_ArchiveTextureArray.clear();
69
NBitmapData* NUITextureArchiver::ExtractTextureStyle(const TCHAR* Style)
71
int num = m_ArchiveTextureArray.size();
72
for(int n = 0; n < num; n++)
74
if(Stricmp(m_ArchiveTextureArray[n]->Style.GetTCharPtr(), Style) == 0)
76
return m_ArchiveTextureArray[n]->TextureData;
82
NBitmapData* NUITextureArchiver::GetTexture(t_u32 index)
84
nuxAssert(index >= 0);
85
nuxAssert(index < m_ArchiveTextureArray.size());
87
if((index < 0) || (index > m_ArchiveTextureArray.size()))
89
return m_ArchiveTextureArray[index]->TextureData;
92
int NUITextureArchiver::GetNumTexture()
94
return m_ArchiveTextureArray.size();
100
// <Image Name="Stroke_10pxrad_2px.tga" type="Stroke" style="eSTROKE_CORNER_ROUND10" border_left="10" border_right="10" border_top="10" border_bottom="10" border_only="true" />
101
// <Image Name="Stroke_4pxrad_2px.tga" type="Stroke" style="eSTROKE_CORNER_ROUND4" border_left="4" border_right="4" border_top="4" border_bottom="4" border_only="true" />
104
bool LoadXMLUITextures(const char* XMLUIFile, std::vector<ArchiveTextureData*>& ArchTexArray)
107
m_FilePath.AddSearchPath(TEXT("")); // for case where fully qualified path is given
108
m_FilePath.AddSearchPath(TEXT("."));
109
m_FilePath.AddSearchPath(TEXT("./Data/UITextures"));
110
m_FilePath.AddSearchPath(TEXT("../Data/UITextures"));
111
m_FilePath.AddSearchPath(TEXT("../../Data/UITextures"));
113
std::string file_search = XMLUIFile;
114
NString painter_filename = m_FilePath.GetFile(file_search.c_str());
115
if (painter_filename == "")
117
printf(TEXT("Unable to locate %s ...\n"), file_search.c_str());
121
TiXmlDocument doc(painter_filename.GetTCharPtr());
123
TiXmlHandle docHandle( &doc );
124
TiXmlElement* data = docHandle.FirstChild("PaintData").Element();
125
TiXmlElement* image = 0;
127
for(image = data->FirstChildElement("Image"); image; image = image->NextSiblingElement("Image"))
129
bool isStroke = false;
130
bool isShape = false;
131
ArchiveTextureData* pimage = new ArchiveTextureData;
132
Memset(pimage, 0, sizeof(ArchiveTextureData));
134
const char* StyleName = image->Attribute("style");
136
pimage->Style = StyleName;
138
// If the attributes border_left, border_right, border_top, border_bottom are not present, assume they are equal to 0;
139
pimage->border_left = pimage->border_right = pimage->border_top = pimage->border_bottom = 0;
141
image->Attribute("border_left", &pimage->border_left);
142
image->Attribute("border_right", &pimage->border_right);
143
image->Attribute("border_top", &pimage->border_top);
144
image->Attribute("border_bottom", &pimage->border_bottom);
147
const char* draw_borders_only = image->Attribute("border_only");
148
if(draw_borders_only == 0)
150
pimage->draw_borders_only = true;
154
if(strcmp("false", draw_borders_only) == 0)
156
pimage->draw_borders_only = false;
160
pimage->draw_borders_only = true;
163
const char* filename = image->Attribute("Name");
164
NString filepath = m_FilePath.GetFile(filename);
165
pimage->SourceFile = filename;
166
if (filepath == TEXT(""))
168
pimage->TextureData = 0;
172
pimage->TextureData = LoadImageFile(filepath.GetTCharPtr());
175
pimage->ArchiveOffset = 0;
176
ArchTexArray.push_back(pimage);
181
// Archive only 2D texture. Do not archive Volumes or Cubemaps
182
bool CreateUITextureArchive(const TCHAR* XMLUIFile, const TCHAR* ArchiveName)
184
std::vector<ArchiveTextureData*> ArchTexArray;
185
if(!LoadXMLUITextures(XMLUIFile, ArchTexArray))
188
NSerializer* fileStream = GFileManager.CreateFileWriter(ArchiveName, NSerializer::Read|NSerializer::Write|NSerializer::OverWriteReadOnly);
190
fileStream->Seek(0, NSerializer::SeekStart);
193
int numtexture = ArchTexArray.size();
195
unsigned int FileTag = UITEXTUREARCHIVETAG; // inalogic user interface texture archive
196
unsigned int FileVersion = UITEXTUREARCHIVEVERSION; // inalogic user interface texture archive
199
fileStream->Serialize((char*) &FileTag, sizeof(FileTag));
200
OFFSET += sizeof(FileTag);
201
fileStream->Serialize((char*) &FileVersion, sizeof(FileVersion));
202
OFFSET += sizeof(FileVersion);
204
// write num textures
205
fileStream->Serialize((char*) &numtexture, sizeof(numtexture));
206
OFFSET += sizeof(numtexture);
208
for(int i = 0; i < numtexture; i++)
210
fileStream->Serialize((char*) TCHAR_TO_ANSI(ArchTexArray[i]->Style.GetTCharPtr()), (t_u32)ArchTexArray[i]->Style.Length()+1);
211
OFFSET += ArchTexArray[i]->Style.Length()+1;
212
fileStream->Serialize((char*) TCHAR_TO_ANSI(ArchTexArray[i]->SourceFile.GetTCharPtr()), (t_u32)ArchTexArray[i]->SourceFile.Length()+1);
213
OFFSET += ArchTexArray[i]->SourceFile.Length()+1;
215
fileStream->Serialize((char*) &(ArchTexArray[i]->border_left), sizeof(ArchTexArray[i]->border_left));
216
OFFSET += sizeof(ArchTexArray[i]->border_left);
217
fileStream->Serialize((char*) &(ArchTexArray[i]->border_right), sizeof(ArchTexArray[i]->border_right));
218
OFFSET += sizeof(ArchTexArray[i]->border_right);
219
fileStream->Serialize((char*) &(ArchTexArray[i]->border_top), sizeof(ArchTexArray[i]->border_top));
220
OFFSET += sizeof(ArchTexArray[i]->border_top);
221
fileStream->Serialize((char*) &(ArchTexArray[i]->border_bottom), sizeof(ArchTexArray[i]->border_bottom));
222
OFFSET += sizeof(ArchTexArray[i]->border_bottom);
224
fileStream->Serialize((char*) &(ArchTexArray[i]->ArchiveOffset), sizeof(ArchTexArray[i]->ArchiveOffset));
225
OFFSET += sizeof(ArchTexArray[i]->ArchiveOffset);
228
unsigned int NumArchived = 0;
229
for(int i = 0; i < numtexture; i++)
231
NFileName Filename(TEXT("../../Data/UITextures/"));
232
Filename += ArchTexArray[i]->SourceFile.GetTCharPtr();
233
NBitmapData *TextureData = LoadImageFile(Filename.GetTCharPtr());
237
TextureArchiveAdd_ver_0_0_1(fileStream, TextureData, ArchTexArray[i]->SourceFile.GetTCharPtr(), OFFSET);
239
ArchTexArray[i]->ArchiveOffset = OFFSET;
243
ArchTexArray[i]->ArchiveOffset = 0xFFFFFFFF;
247
// Second pass with the header where we write the offset to the texture data
248
fileStream->Seek(sizeof(FileTag)+sizeof(FileVersion), NSerializer::SeekStart);
249
// Write the true number of textures that has been archived.
250
fileStream->Serialize((char*) &NumArchived, sizeof(NumArchived));
252
for(int i = 0; i < numtexture; i++)
254
fileStream->Serialize((char*) TCHAR_TO_ANSI(ArchTexArray[i]->Style.GetTCharPtr()), (t_u32)ArchTexArray[i]->Style.Length()+1);
255
fileStream->Serialize((char*) TCHAR_TO_ANSI(ArchTexArray[i]->SourceFile.GetTCharPtr()), (t_u32)ArchTexArray[i]->SourceFile.Length()+1);
257
fileStream->Serialize((char*) &(ArchTexArray[i]->border_left), sizeof(ArchTexArray[i]->border_left));
258
fileStream->Serialize((char*) &(ArchTexArray[i]->border_right), sizeof(ArchTexArray[i]->border_right));
259
fileStream->Serialize((char*) &(ArchTexArray[i]->border_top), sizeof(ArchTexArray[i]->border_top));
260
fileStream->Serialize((char*) &(ArchTexArray[i]->border_bottom), sizeof(ArchTexArray[i]->border_bottom));
262
int ddd = ArchTexArray[i]->ArchiveOffset;
263
fileStream->Serialize((char*) &(ArchTexArray[i]->ArchiveOffset), sizeof(ArchTexArray[i]->ArchiveOffset));
264
ddd = fileStream->Tell();
271
bool LoadUIArchive(const TCHAR* ArchiveName, std::vector<ArchiveTextureData*>& ArchTexArray)
273
NSerializer* fileStream = GFileManager.CreateFileReader(TCHAR_TO_ANSI(ArchiveName), NSerializer::Read|NSerializer::Write);
275
fileStream->Seek(0, NSerializer::SeekStart);
280
unsigned int FileTag;
281
unsigned int FileVersion;
282
fileStream->Serialize((char*) &FileTag, sizeof(FileTag));
283
fileStream->Serialize((char*) &FileVersion, sizeof(FileVersion));
285
if(FileTag != UITEXTUREARCHIVETAG)
287
nuxAssertMsg(0, TEXT("[ReadArchive] File: %s is not a texture archive."), ArchiveName);
291
fileStream->Serialize((char*) &numtexture, sizeof(numtexture));
292
OFFSET = fileStream->Tell();
294
char CharBuffer[2048];
295
for(int i = 0; i < numtexture; i++)
298
do {fileStream->Serialize(&CharBuffer[c], 1); c++;} while(CharBuffer[c-1] != 0);
299
CharBuffer[c] = 0; // add null terminating char
300
NString Style = CharBuffer;
303
do {fileStream->Serialize(&CharBuffer[c], 1); c++;} while(CharBuffer[c-1] != 0);
304
CharBuffer[c] = 0; // add null terminating char
305
NString SourceFile = CharBuffer;
307
unsigned int border_left;
308
unsigned int border_right;
309
unsigned int border_top;
310
unsigned int border_bottom;
312
fileStream->Serialize((char*) &border_left, sizeof(border_left));
313
fileStream->Serialize((char*) &border_right, sizeof(border_right));
314
fileStream->Serialize((char*) &border_top, sizeof(border_top));
315
fileStream->Serialize((char*) &border_bottom, sizeof(border_bottom));
318
unsigned int DataOffset;
319
fileStream->Serialize((char*) &DataOffset, sizeof(DataOffset));
321
int CurrentPos = fileStream->Tell();
323
//nuxDebugMsg(TEXT("%s - %s"), Style.GetTCharPtr(), SourceFile.GetTCharPtr());
324
if(DataOffset == 0xFFFFFFFF)
326
nuxDebugMsg(TEXT("[LoadUIArchive] Can't find file %s in UI archive %s. Skipping..."), SourceFile.GetTCharPtr(), ArchiveName);
328
NBitmapData* TextureData = TextureArchiveLoad_ver_0_0_1(fileStream, DataOffset);
330
ArchiveTextureData* pimage = new ArchiveTextureData;
331
pimage->SourceFile = SourceFile;
332
pimage->Style = Style;
333
pimage->TextureData = TextureData;
334
pimage->border_left = border_left;
335
pimage->border_right = border_right;
336
pimage->border_top = border_top;
337
pimage->border_bottom = border_bottom;
339
ArchTexArray.push_back(pimage);
341
// Go back in the header section
342
fileStream->Seek(CurrentPos, NSerializer::SeekStart);
349
//NTextureArchiveManager ////////////////////////////////////////////
351
NTextureArchiveManager::NTextureArchiveManager()
353
, m_NumberOfTextures(0)
359
NTextureArchiveManager::~NTextureArchiveManager()
363
m_FileStream->Close();
368
bool NTextureArchiveManager::CreateTextureArchiveFile(const TCHAR* TextureArchiveFilename)
370
#define CHECK_ITX_WRITE_ERROR /*if(m_FileStream.bad()) {m_FileStream->close(); nuxAssertMsg(0, TEXT("[CreateTextureArchiveFile] Write Error.")); return false;}*/
372
m_FileStream = GFileManager.CreateFileWriter(TCHAR_TO_ANSI(TextureArchiveFilename), NSerializer::Read|NSerializer::Write);
375
nuxAssertMsg(0, TEXT("[CreateTextureArchiveFile] Can't open file: %s"), TextureArchiveFilename);
379
m_FileStream->Seek(0, NSerializer::SeekStart);
380
unsigned int ArchiveTag = TEXTUREARCHIVETAG;
381
unsigned int ArchiveFormatVersion = TEXTUREARCHIVEVERSION;
382
m_NumberOfTextures = 0;
383
NTimeStamp TimeStamp;
386
m_FileStream->Serialize((char*) &ArchiveTag, sizeof(ArchiveTag)); CHECK_ITX_WRITE_ERROR;
387
m_FileStream->Serialize((char*) &ArchiveFormatVersion, sizeof(ArchiveFormatVersion)); CHECK_ITX_WRITE_ERROR;
390
m_FileStream->Serialize((char*) &TimeStamp.m_Year, sizeof(TimeStamp.m_Year)); CHECK_ITX_WRITE_ERROR;
391
m_FileStream->Serialize((char*) &TimeStamp.m_Month, sizeof(TimeStamp.m_Month)); CHECK_ITX_WRITE_ERROR;
392
m_FileStream->Serialize((char*) &TimeStamp.m_Day, sizeof(TimeStamp.m_Day)); CHECK_ITX_WRITE_ERROR;
393
m_FileStream->Serialize((char*) &TimeStamp.m_Hour, sizeof(TimeStamp.m_Hour)); CHECK_ITX_WRITE_ERROR;
394
m_FileStream->Serialize((char*) &TimeStamp.m_Minute, sizeof(TimeStamp.m_Minute)); CHECK_ITX_WRITE_ERROR;
395
m_FileStream->Serialize((char*) &TimeStamp.m_Second, sizeof(TimeStamp.m_Second)); CHECK_ITX_WRITE_ERROR;
396
m_FileStream->Serialize((char*) &TimeStamp.m_MicroSecond, sizeof(TimeStamp.m_MicroSecond)); CHECK_ITX_WRITE_ERROR;
399
m_FileStream->Serialize((char*) &TimeStamp.m_Year, sizeof(TimeStamp.m_Year)); CHECK_ITX_WRITE_ERROR;
400
m_FileStream->Serialize((char*) &TimeStamp.m_Month, sizeof(TimeStamp.m_Month)); CHECK_ITX_WRITE_ERROR;
401
m_FileStream->Serialize((char*) &TimeStamp.m_Day, sizeof(TimeStamp.m_Day)); CHECK_ITX_WRITE_ERROR;
402
m_FileStream->Serialize((char*) &TimeStamp.m_Hour, sizeof(TimeStamp.m_Hour)); CHECK_ITX_WRITE_ERROR;
403
m_FileStream->Serialize((char*) &TimeStamp.m_Minute, sizeof(TimeStamp.m_Minute)); CHECK_ITX_WRITE_ERROR;
404
m_FileStream->Serialize((char*) &TimeStamp.m_Second, sizeof(TimeStamp.m_Second)); CHECK_ITX_WRITE_ERROR;
405
m_FileStream->Serialize((char*) &TimeStamp.m_MicroSecond, sizeof(TimeStamp.m_MicroSecond)); CHECK_ITX_WRITE_ERROR;
407
// Number of Textures in the archives
408
m_FileStream->Serialize((char*) &m_NumberOfTextures, sizeof(m_NumberOfTextures)); CHECK_ITX_WRITE_ERROR;
411
m_CurrentTextureArchive = TextureArchiveFilename;
413
#undef CHECK_ITX_WRITE_ERROR
417
bool NTextureArchiveManager::AddTextureToArchive(const TCHAR* SourceFolder, const TCHAR* TextureFilename)
421
nuxAssertMsg(0, TEXT("[NTextureArchiveManager::AddTextureToArchive] Cannot add texture to archive. Load texture archive first."));
426
if((SourceFolder != 0) && (SourceFolder != TEXT("")))
428
Filename = SourceFolder;
429
Filename.RemoveBackSlashAtEnd();
430
Filename.RemoveSlashAtEnd();
431
Filename.AddSlashAtEnd();
433
Filename += TextureFilename;
434
NBitmapData *TextureData = LoadImageFile(Filename.GetTCharPtr());
439
TextureArchiveAdd_ver_0_0_1(m_FileStream, TextureData, TextureFilename, Offset);
440
m_NumberOfTextures++;
442
// Update the "last modified" date and the number of textures in the archive.
443
m_FileStream->Seek(TEXTUREACHIVEHEADER_SIZE, NSerializer::SeekStart);
445
NTimeStamp TimeStamp;
449
m_FileStream->Serialize((char*) &TimeStamp.m_Year, sizeof(TimeStamp.m_Year));
450
m_FileStream->Serialize((char*) &TimeStamp.m_Month, sizeof(TimeStamp.m_Month));
451
m_FileStream->Serialize((char*) &TimeStamp.m_Day, sizeof(TimeStamp.m_Day));
452
m_FileStream->Serialize((char*) &TimeStamp.m_Hour, sizeof(TimeStamp.m_Hour));
453
m_FileStream->Serialize((char*) &TimeStamp.m_Minute, sizeof(TimeStamp.m_Minute));
454
m_FileStream->Serialize((char*) &TimeStamp.m_Second, sizeof(TimeStamp.m_Second));
455
m_FileStream->Serialize((char*) &TimeStamp.m_MicroSecond, sizeof(TimeStamp.m_MicroSecond));
457
// Number of Textures in the archives
458
m_FileStream->Serialize((char*) &m_NumberOfTextures, sizeof(m_NumberOfTextures));
463
bool NTextureArchiveManager::LoadTextureArchiveFile(const TCHAR* Filename)
468
bool NTextureArchiveManager::CloseTextureArchiveFile()
471
m_FileStream->Close();
472
INL_SAFE_DELETE(m_FileStream);
473
m_CurrentTextureArchive = TEXT("");
478
bool NTextureArchiveManager::PointToFirstTexture()
480
nuxAssert(m_FileStream);
481
if(m_FileStream == 0)
484
m_FileStream->Seek(0, NSerializer::SeekStart);
485
unsigned int ArchiveTag = 0;
486
unsigned int ArchiveFormatVersion = 0;
487
//unsigned int NumTextures = 0;
488
NTimeStamp TimeStamp;
491
m_FileStream->Serialize((char*) &ArchiveTag, sizeof(ArchiveTag)); // should be 0x20787469
492
m_FileStream->Serialize((char*) &ArchiveFormatVersion, sizeof(ArchiveFormatVersion));
493
nuxDebugMsg(TEXT("File Tag: %c%c%c%c"),
495
(ArchiveTag & 0xFF00) >> 8,
496
(ArchiveTag & 0xFF0000) >> 16,
497
(ArchiveTag & 0xFF000000) >> 24);
498
nuxDebugMsg(TEXT("File Version: %c.%c.%c.%c"),
499
(ArchiveFormatVersion & 0xFF),
500
(ArchiveFormatVersion & 0xFF00) >> 8,
501
(ArchiveFormatVersion & 0xFF0000) >> 16,
502
(ArchiveFormatVersion & 0xFF000000) >> 24);
505
m_FileStream->Serialize((char*) &TimeStamp.m_Year, sizeof(TimeStamp.m_Year));
506
m_FileStream->Serialize((char*) &TimeStamp.m_Month, sizeof(TimeStamp.m_Month));
507
m_FileStream->Serialize((char*) &TimeStamp.m_Day, sizeof(TimeStamp.m_Day));
508
m_FileStream->Serialize((char*) &TimeStamp.m_Hour, sizeof(TimeStamp.m_Hour));
509
m_FileStream->Serialize((char*) &TimeStamp.m_Minute, sizeof(TimeStamp.m_Minute));
510
m_FileStream->Serialize((char*) &TimeStamp.m_Second, sizeof(TimeStamp.m_Second));
511
m_FileStream->Serialize((char*) &TimeStamp.m_MicroSecond, sizeof(TimeStamp.m_MicroSecond));
512
nuxDebugMsg(TEXT("File created on: %d/%d/%d at %d:%d:%d"), TimeStamp.m_Year, TimeStamp.m_Month, TimeStamp.m_Day, TimeStamp.m_Hour, TimeStamp.m_Minute, TimeStamp.m_Second);
515
m_FileStream->Serialize((char*) &TimeStamp.m_Year, sizeof(TimeStamp.m_Year));
516
m_FileStream->Serialize((char*) &TimeStamp.m_Month, sizeof(TimeStamp.m_Month));
517
m_FileStream->Serialize((char*) &TimeStamp.m_Day, sizeof(TimeStamp.m_Day));
518
m_FileStream->Serialize((char*) &TimeStamp.m_Hour, sizeof(TimeStamp.m_Hour));
519
m_FileStream->Serialize((char*) &TimeStamp.m_Minute, sizeof(TimeStamp.m_Minute));
520
m_FileStream->Serialize((char*) &TimeStamp.m_Second, sizeof(TimeStamp.m_Second));
521
m_FileStream->Serialize((char*) &TimeStamp.m_MicroSecond, sizeof(TimeStamp.m_MicroSecond));
522
nuxDebugMsg(TEXT("Last modified on: %d/%d/%d at %d:%d:%d"), TimeStamp.m_Year, TimeStamp.m_Month, TimeStamp.m_Day, TimeStamp.m_Hour, TimeStamp.m_Minute, TimeStamp.m_Second);
524
// Number of Textures in the archives
525
m_FileStream->Serialize((char*) &m_NumberOfTextures, sizeof(m_NumberOfTextures));
530
void NTextureArchiveManager::PrintArchiveContent(const TCHAR* TextureArchiveFilename)
533
m_FileStream->Close();
534
m_FileStream = GFileManager.CreateFileReader(TextureArchiveFilename, NSerializer::NoOverWrite|NSerializer::Read|NSerializer::Write);
537
PointToFirstTexture();
538
for(unsigned int i = 0; i < m_NumberOfTextures; i++)
540
TextureArchiveInfo_ver_0_0_1 TextureArchiveInfo;
541
TextureArchiveGetInfo_ver_0_0_1(m_FileStream, TextureArchiveInfo);
542
nuxDebugMsg(TEXT("File: %s"), ANSI_TO_TCHAR(TextureArchiveInfo.Name.GetTCharPtr()));
543
nuxDebugMsg(TEXT("---------------------------------------------"));
544
nuxDebugMsg(TEXT(" Type: %s"), (TextureArchiveInfo.Type == ARCH_TEXTURE2D) ? TEXT("Texture2D") :
545
(TextureArchiveInfo.Type == ARCH_CUBEMAP) ? TEXT("Cubemap Texture") :
546
(TextureArchiveInfo.Type == ARCH_VOLUME) ? TEXT("Volume Texture") :
547
TEXT("Unknown Texture") );
548
nuxDebugMsg(TEXT(" Format: %s"), GPixelFormats[TextureArchiveInfo.Format].Name);
549
nuxDebugMsg(TEXT(" Width: %d"), TextureArchiveInfo.Width);
550
nuxDebugMsg(TEXT(" Height: %d"), TextureArchiveInfo.Height);
551
nuxDebugMsg(TEXT(" Depth: %d"), TextureArchiveInfo.Depth);
552
nuxDebugMsg(TEXT(" NumMipmap: %d"), TextureArchiveInfo.NumMipmap);
553
nuxDebugMsg(TEXT(" Size: %d"), TextureArchiveInfo.Size);
556
CloseTextureArchiveFile();
560
void NTextureArchiveManager::TraverseTextures(const TCHAR* TextureArchiveFilename)
563
m_FileStream->Close();
564
m_FileStream = GFileManager.CreateFileReader(TextureArchiveFilename, NSerializer::NoOverWrite|NSerializer::Read|NSerializer::Write);
566
PointToFirstTexture();
567
for(unsigned int i = 0; i < m_NumberOfTextures; i++)
569
unsigned int Offset = m_FileStream->Tell();
570
TextureArchiveLoad_ver_0_0_1(m_FileStream, Offset);
573
CloseTextureArchiveFile();
576
NBitmapData* NTextureArchiveManager::LoadBitmapArchive(const TCHAR* TextureArchiveFilename, const TCHAR* Filename)
579
m_FileStream->Close();
580
m_FileStream = GFileManager.CreateFileReader(TextureArchiveFilename, NSerializer::NoOverWrite|NSerializer::Read|NSerializer::Write);
582
PointToFirstTexture();
583
for(unsigned int i = 0; i < m_NumberOfTextures; i++)
585
TextureArchiveInfo_ver_0_0_1 TextureArchiveInfo;
586
TextureArchiveGetInfo_ver_0_0_1(m_FileStream, TextureArchiveInfo);
587
if(Stricmp(Filename, TextureArchiveInfo.Name.GetTCharPtr()) == 0)
589
return TextureArchiveLoad_ver_0_0_1(m_FileStream, TextureArchiveInfo.FilePointer);
593
CloseTextureArchiveFile();
23
#include "NuxCore/NKernel.h"
25
#include "NuxCore/FilePath.h"
26
#include "NuxImage/Tga.h"
27
#include "NuxImage/ImageSurface.h"
28
#include "NuxImage/NITX.h"
29
#include "NTextureArchiveManager.h"
31
#include "NuxCore/TinyXML/tinyxml.h"
35
bool IsUITextureArchive(const TCHAR* ArchiveFileName)
37
NSerializer* fileStream = GFileManager.CreateFileReader(ArchiveFileName, NSerializer::Read|NSerializer::Write);
39
fileStream->Seek(0, NSerializer::SeekStart);
42
fileStream->Serialize((char*) &FileTag, sizeof(FileTag));
45
if(FileTag != UITEXTUREARCHIVETAG)
52
NUITextureArchiver::NUITextureArchiver(const TCHAR* ArchiveFileName)
54
if(IsUITextureArchive(ArchiveFileName))
55
LoadUIArchive(ArchiveFileName, m_ArchiveTextureArray);
58
NUITextureArchiver::~NUITextureArchiver()
60
int num = m_ArchiveTextureArray.size();
61
for(int n = 0; n < num; n++)
63
delete m_ArchiveTextureArray[n]->TextureData;
64
delete m_ArchiveTextureArray[n];
66
m_ArchiveTextureArray.clear();
69
NBitmapData* NUITextureArchiver::ExtractTextureStyle(const TCHAR* Style)
71
int num = m_ArchiveTextureArray.size();
72
for(int n = 0; n < num; n++)
74
if(Stricmp(m_ArchiveTextureArray[n]->Style.GetTCharPtr(), Style) == 0)
76
return m_ArchiveTextureArray[n]->TextureData;
82
NBitmapData* NUITextureArchiver::GetTexture(t_u32 index)
84
nuxAssert(index >= 0);
85
nuxAssert(index < m_ArchiveTextureArray.size());
87
if((index < 0) || (index > m_ArchiveTextureArray.size()))
89
return m_ArchiveTextureArray[index]->TextureData;
92
int NUITextureArchiver::GetNumTexture()
94
return m_ArchiveTextureArray.size();
100
// <Image Name="Stroke_10pxrad_2px.tga" type="Stroke" style="eSTROKE_CORNER_ROUND10" border_left="10" border_right="10" border_top="10" border_bottom="10" border_only="true" />
101
// <Image Name="Stroke_4pxrad_2px.tga" type="Stroke" style="eSTROKE_CORNER_ROUND4" border_left="4" border_right="4" border_top="4" border_bottom="4" border_only="true" />
104
bool LoadXMLUITextures(const char* XMLUIFile, std::vector<ArchiveTextureData*>& ArchTexArray)
107
m_FilePath.AddSearchPath(TEXT("")); // for case where fully qualified path is given
108
m_FilePath.AddSearchPath(TEXT("."));
109
m_FilePath.AddSearchPath(TEXT("./Data/UITextures"));
110
m_FilePath.AddSearchPath(TEXT("../Data/UITextures"));
111
m_FilePath.AddSearchPath(TEXT("../../Data/UITextures"));
113
std::string file_search = XMLUIFile;
114
NString painter_filename = m_FilePath.GetFile(file_search.c_str());
115
if (painter_filename == "")
117
printf(TEXT("Unable to locate %s ...\n"), file_search.c_str());
121
TiXmlDocument doc(painter_filename.GetTCharPtr());
123
TiXmlHandle docHandle( &doc );
124
TiXmlElement* data = docHandle.FirstChild("PaintData").Element();
125
TiXmlElement* image = 0;
127
for(image = data->FirstChildElement("Image"); image; image = image->NextSiblingElement("Image"))
129
bool isStroke = false;
130
bool isShape = false;
131
ArchiveTextureData* pimage = new ArchiveTextureData;
132
Memset(pimage, 0, sizeof(ArchiveTextureData));
134
const char* StyleName = image->Attribute("style");
136
pimage->Style = StyleName;
138
// If the attributes border_left, border_right, border_top, border_bottom are not present, assume they are equal to 0;
139
pimage->border_left = pimage->border_right = pimage->border_top = pimage->border_bottom = 0;
141
image->Attribute("border_left", &pimage->border_left);
142
image->Attribute("border_right", &pimage->border_right);
143
image->Attribute("border_top", &pimage->border_top);
144
image->Attribute("border_bottom", &pimage->border_bottom);
147
const char* draw_borders_only = image->Attribute("border_only");
148
if(draw_borders_only == 0)
150
pimage->draw_borders_only = true;
154
if(strcmp("false", draw_borders_only) == 0)
156
pimage->draw_borders_only = false;
160
pimage->draw_borders_only = true;
163
const char* filename = image->Attribute("Name");
164
NString filepath = m_FilePath.GetFile(filename);
165
pimage->SourceFile = filename;
166
if (filepath == TEXT(""))
168
pimage->TextureData = 0;
172
pimage->TextureData = LoadImageFile(filepath.GetTCharPtr());
175
pimage->ArchiveOffset = 0;
176
ArchTexArray.push_back(pimage);
181
// Archive only 2D texture. Do not archive Volumes or Cubemaps
182
bool CreateUITextureArchive(const TCHAR* XMLUIFile, const TCHAR* ArchiveName)
184
std::vector<ArchiveTextureData*> ArchTexArray;
185
if(!LoadXMLUITextures(XMLUIFile, ArchTexArray))
188
NSerializer* fileStream = GFileManager.CreateFileWriter(ArchiveName, NSerializer::Read|NSerializer::Write|NSerializer::OverWriteReadOnly);
190
fileStream->Seek(0, NSerializer::SeekStart);
193
int numtexture = ArchTexArray.size();
195
unsigned int FileTag = UITEXTUREARCHIVETAG; // inalogic user interface texture archive
196
unsigned int FileVersion = UITEXTUREARCHIVEVERSION; // inalogic user interface texture archive
199
fileStream->Serialize((char*) &FileTag, sizeof(FileTag));
200
OFFSET += sizeof(FileTag);
201
fileStream->Serialize((char*) &FileVersion, sizeof(FileVersion));
202
OFFSET += sizeof(FileVersion);
204
// write num textures
205
fileStream->Serialize((char*) &numtexture, sizeof(numtexture));
206
OFFSET += sizeof(numtexture);
208
for(int i = 0; i < numtexture; i++)
210
fileStream->Serialize((char*) TCHAR_TO_ANSI(ArchTexArray[i]->Style.GetTCharPtr()), (t_u32)ArchTexArray[i]->Style.Length()+1);
211
OFFSET += ArchTexArray[i]->Style.Length()+1;
212
fileStream->Serialize((char*) TCHAR_TO_ANSI(ArchTexArray[i]->SourceFile.GetTCharPtr()), (t_u32)ArchTexArray[i]->SourceFile.Length()+1);
213
OFFSET += ArchTexArray[i]->SourceFile.Length()+1;
215
fileStream->Serialize((char*) &(ArchTexArray[i]->border_left), sizeof(ArchTexArray[i]->border_left));
216
OFFSET += sizeof(ArchTexArray[i]->border_left);
217
fileStream->Serialize((char*) &(ArchTexArray[i]->border_right), sizeof(ArchTexArray[i]->border_right));
218
OFFSET += sizeof(ArchTexArray[i]->border_right);
219
fileStream->Serialize((char*) &(ArchTexArray[i]->border_top), sizeof(ArchTexArray[i]->border_top));
220
OFFSET += sizeof(ArchTexArray[i]->border_top);
221
fileStream->Serialize((char*) &(ArchTexArray[i]->border_bottom), sizeof(ArchTexArray[i]->border_bottom));
222
OFFSET += sizeof(ArchTexArray[i]->border_bottom);
224
fileStream->Serialize((char*) &(ArchTexArray[i]->ArchiveOffset), sizeof(ArchTexArray[i]->ArchiveOffset));
225
OFFSET += sizeof(ArchTexArray[i]->ArchiveOffset);
228
unsigned int NumArchived = 0;
229
for(int i = 0; i < numtexture; i++)
231
NFileName Filename(TEXT("../../Data/UITextures/"));
232
Filename += ArchTexArray[i]->SourceFile.GetTCharPtr();
233
NBitmapData *TextureData = LoadImageFile(Filename.GetTCharPtr());
237
TextureArchiveAdd_ver_0_0_1(fileStream, TextureData, ArchTexArray[i]->SourceFile.GetTCharPtr(), OFFSET);
239
ArchTexArray[i]->ArchiveOffset = OFFSET;
243
ArchTexArray[i]->ArchiveOffset = 0xFFFFFFFF;
247
// Second pass with the header where we write the offset to the texture data
248
fileStream->Seek(sizeof(FileTag)+sizeof(FileVersion), NSerializer::SeekStart);
249
// Write the true number of textures that has been archived.
250
fileStream->Serialize((char*) &NumArchived, sizeof(NumArchived));
252
for(int i = 0; i < numtexture; i++)
254
fileStream->Serialize((char*) TCHAR_TO_ANSI(ArchTexArray[i]->Style.GetTCharPtr()), (t_u32)ArchTexArray[i]->Style.Length()+1);
255
fileStream->Serialize((char*) TCHAR_TO_ANSI(ArchTexArray[i]->SourceFile.GetTCharPtr()), (t_u32)ArchTexArray[i]->SourceFile.Length()+1);
257
fileStream->Serialize((char*) &(ArchTexArray[i]->border_left), sizeof(ArchTexArray[i]->border_left));
258
fileStream->Serialize((char*) &(ArchTexArray[i]->border_right), sizeof(ArchTexArray[i]->border_right));
259
fileStream->Serialize((char*) &(ArchTexArray[i]->border_top), sizeof(ArchTexArray[i]->border_top));
260
fileStream->Serialize((char*) &(ArchTexArray[i]->border_bottom), sizeof(ArchTexArray[i]->border_bottom));
262
int ddd = ArchTexArray[i]->ArchiveOffset;
263
fileStream->Serialize((char*) &(ArchTexArray[i]->ArchiveOffset), sizeof(ArchTexArray[i]->ArchiveOffset));
264
ddd = fileStream->Tell();
271
bool LoadUIArchive(const TCHAR* ArchiveName, std::vector<ArchiveTextureData*>& ArchTexArray)
273
NSerializer* fileStream = GFileManager.CreateFileReader(TCHAR_TO_ANSI(ArchiveName), NSerializer::Read|NSerializer::Write);
275
fileStream->Seek(0, NSerializer::SeekStart);
280
unsigned int FileTag;
281
unsigned int FileVersion;
282
fileStream->Serialize((char*) &FileTag, sizeof(FileTag));
283
fileStream->Serialize((char*) &FileVersion, sizeof(FileVersion));
285
if(FileTag != UITEXTUREARCHIVETAG)
287
nuxAssertMsg(0, TEXT("[ReadArchive] File: %s is not a texture archive."), ArchiveName);
291
fileStream->Serialize((char*) &numtexture, sizeof(numtexture));
292
OFFSET = fileStream->Tell();
294
char CharBuffer[2048];
295
for(int i = 0; i < numtexture; i++)
298
do {fileStream->Serialize(&CharBuffer[c], 1); c++;} while(CharBuffer[c-1] != 0);
299
CharBuffer[c] = 0; // add null terminating char
300
NString Style = CharBuffer;
303
do {fileStream->Serialize(&CharBuffer[c], 1); c++;} while(CharBuffer[c-1] != 0);
304
CharBuffer[c] = 0; // add null terminating char
305
NString SourceFile = CharBuffer;
307
unsigned int border_left;
308
unsigned int border_right;
309
unsigned int border_top;
310
unsigned int border_bottom;
312
fileStream->Serialize((char*) &border_left, sizeof(border_left));
313
fileStream->Serialize((char*) &border_right, sizeof(border_right));
314
fileStream->Serialize((char*) &border_top, sizeof(border_top));
315
fileStream->Serialize((char*) &border_bottom, sizeof(border_bottom));
318
unsigned int DataOffset;
319
fileStream->Serialize((char*) &DataOffset, sizeof(DataOffset));
321
int CurrentPos = fileStream->Tell();
323
//nuxDebugMsg(TEXT("%s - %s"), Style.GetTCharPtr(), SourceFile.GetTCharPtr());
324
if(DataOffset == 0xFFFFFFFF)
326
nuxDebugMsg(TEXT("[LoadUIArchive] Can't find file %s in UI archive %s. Skipping..."), SourceFile.GetTCharPtr(), ArchiveName);
328
NBitmapData* TextureData = TextureArchiveLoad_ver_0_0_1(fileStream, DataOffset);
330
ArchiveTextureData* pimage = new ArchiveTextureData;
331
pimage->SourceFile = SourceFile;
332
pimage->Style = Style;
333
pimage->TextureData = TextureData;
334
pimage->border_left = border_left;
335
pimage->border_right = border_right;
336
pimage->border_top = border_top;
337
pimage->border_bottom = border_bottom;
339
ArchTexArray.push_back(pimage);
341
// Go back in the header section
342
fileStream->Seek(CurrentPos, NSerializer::SeekStart);
349
//NTextureArchiveManager ////////////////////////////////////////////
351
NTextureArchiveManager::NTextureArchiveManager()
353
, m_NumberOfTextures(0)
359
NTextureArchiveManager::~NTextureArchiveManager()
363
m_FileStream->Close();
368
bool NTextureArchiveManager::CreateTextureArchiveFile(const TCHAR* TextureArchiveFilename)
370
#define CHECK_ITX_WRITE_ERROR /*if(m_FileStream.bad()) {m_FileStream->close(); nuxAssertMsg(0, TEXT("[CreateTextureArchiveFile] Write Error.")); return false;}*/
372
m_FileStream = GFileManager.CreateFileWriter(TCHAR_TO_ANSI(TextureArchiveFilename), NSerializer::Read|NSerializer::Write);
375
nuxAssertMsg(0, TEXT("[CreateTextureArchiveFile] Can't open file: %s"), TextureArchiveFilename);
379
m_FileStream->Seek(0, NSerializer::SeekStart);
380
unsigned int ArchiveTag = TEXTUREARCHIVETAG;
381
unsigned int ArchiveFormatVersion = TEXTUREARCHIVEVERSION;
382
m_NumberOfTextures = 0;
383
NTimeStamp TimeStamp;
386
m_FileStream->Serialize((char*) &ArchiveTag, sizeof(ArchiveTag)); CHECK_ITX_WRITE_ERROR;
387
m_FileStream->Serialize((char*) &ArchiveFormatVersion, sizeof(ArchiveFormatVersion)); CHECK_ITX_WRITE_ERROR;
390
m_FileStream->Serialize((char*) &TimeStamp.m_Year, sizeof(TimeStamp.m_Year)); CHECK_ITX_WRITE_ERROR;
391
m_FileStream->Serialize((char*) &TimeStamp.m_Month, sizeof(TimeStamp.m_Month)); CHECK_ITX_WRITE_ERROR;
392
m_FileStream->Serialize((char*) &TimeStamp.m_Day, sizeof(TimeStamp.m_Day)); CHECK_ITX_WRITE_ERROR;
393
m_FileStream->Serialize((char*) &TimeStamp.m_Hour, sizeof(TimeStamp.m_Hour)); CHECK_ITX_WRITE_ERROR;
394
m_FileStream->Serialize((char*) &TimeStamp.m_Minute, sizeof(TimeStamp.m_Minute)); CHECK_ITX_WRITE_ERROR;
395
m_FileStream->Serialize((char*) &TimeStamp.m_Second, sizeof(TimeStamp.m_Second)); CHECK_ITX_WRITE_ERROR;
396
m_FileStream->Serialize((char*) &TimeStamp.m_MicroSecond, sizeof(TimeStamp.m_MicroSecond)); CHECK_ITX_WRITE_ERROR;
399
m_FileStream->Serialize((char*) &TimeStamp.m_Year, sizeof(TimeStamp.m_Year)); CHECK_ITX_WRITE_ERROR;
400
m_FileStream->Serialize((char*) &TimeStamp.m_Month, sizeof(TimeStamp.m_Month)); CHECK_ITX_WRITE_ERROR;
401
m_FileStream->Serialize((char*) &TimeStamp.m_Day, sizeof(TimeStamp.m_Day)); CHECK_ITX_WRITE_ERROR;
402
m_FileStream->Serialize((char*) &TimeStamp.m_Hour, sizeof(TimeStamp.m_Hour)); CHECK_ITX_WRITE_ERROR;
403
m_FileStream->Serialize((char*) &TimeStamp.m_Minute, sizeof(TimeStamp.m_Minute)); CHECK_ITX_WRITE_ERROR;
404
m_FileStream->Serialize((char*) &TimeStamp.m_Second, sizeof(TimeStamp.m_Second)); CHECK_ITX_WRITE_ERROR;
405
m_FileStream->Serialize((char*) &TimeStamp.m_MicroSecond, sizeof(TimeStamp.m_MicroSecond)); CHECK_ITX_WRITE_ERROR;
407
// Number of Textures in the archives
408
m_FileStream->Serialize((char*) &m_NumberOfTextures, sizeof(m_NumberOfTextures)); CHECK_ITX_WRITE_ERROR;
411
m_CurrentTextureArchive = TextureArchiveFilename;
413
#undef CHECK_ITX_WRITE_ERROR
417
bool NTextureArchiveManager::AddTextureToArchive(const TCHAR* SourceFolder, const TCHAR* TextureFilename)
421
nuxAssertMsg(0, TEXT("[NTextureArchiveManager::AddTextureToArchive] Cannot add texture to archive. Load texture archive first."));
426
if((SourceFolder != 0) && (SourceFolder != TEXT("")))
428
Filename = SourceFolder;
429
Filename.RemoveBackSlashAtEnd();
430
Filename.RemoveSlashAtEnd();
431
Filename.AddSlashAtEnd();
433
Filename += TextureFilename;
434
NBitmapData *TextureData = LoadImageFile(Filename.GetTCharPtr());
439
TextureArchiveAdd_ver_0_0_1(m_FileStream, TextureData, TextureFilename, Offset);
440
m_NumberOfTextures++;
442
// Update the "last modified" date and the number of textures in the archive.
443
m_FileStream->Seek(TEXTUREACHIVEHEADER_SIZE, NSerializer::SeekStart);
445
NTimeStamp TimeStamp;
449
m_FileStream->Serialize((char*) &TimeStamp.m_Year, sizeof(TimeStamp.m_Year));
450
m_FileStream->Serialize((char*) &TimeStamp.m_Month, sizeof(TimeStamp.m_Month));
451
m_FileStream->Serialize((char*) &TimeStamp.m_Day, sizeof(TimeStamp.m_Day));
452
m_FileStream->Serialize((char*) &TimeStamp.m_Hour, sizeof(TimeStamp.m_Hour));
453
m_FileStream->Serialize((char*) &TimeStamp.m_Minute, sizeof(TimeStamp.m_Minute));
454
m_FileStream->Serialize((char*) &TimeStamp.m_Second, sizeof(TimeStamp.m_Second));
455
m_FileStream->Serialize((char*) &TimeStamp.m_MicroSecond, sizeof(TimeStamp.m_MicroSecond));
457
// Number of Textures in the archives
458
m_FileStream->Serialize((char*) &m_NumberOfTextures, sizeof(m_NumberOfTextures));
463
bool NTextureArchiveManager::LoadTextureArchiveFile(const TCHAR* Filename)
468
bool NTextureArchiveManager::CloseTextureArchiveFile()
471
m_FileStream->Close();
472
INL_SAFE_DELETE(m_FileStream);
473
m_CurrentTextureArchive = TEXT("");
478
bool NTextureArchiveManager::PointToFirstTexture()
480
nuxAssert(m_FileStream);
481
if(m_FileStream == 0)
484
m_FileStream->Seek(0, NSerializer::SeekStart);
485
unsigned int ArchiveTag = 0;
486
unsigned int ArchiveFormatVersion = 0;
487
//unsigned int NumTextures = 0;
488
NTimeStamp TimeStamp;
491
m_FileStream->Serialize((char*) &ArchiveTag, sizeof(ArchiveTag)); // should be 0x20787469
492
m_FileStream->Serialize((char*) &ArchiveFormatVersion, sizeof(ArchiveFormatVersion));
493
nuxDebugMsg(TEXT("File Tag: %c%c%c%c"),
495
(ArchiveTag & 0xFF00) >> 8,
496
(ArchiveTag & 0xFF0000) >> 16,
497
(ArchiveTag & 0xFF000000) >> 24);
498
nuxDebugMsg(TEXT("File Version: %c.%c.%c.%c"),
499
(ArchiveFormatVersion & 0xFF),
500
(ArchiveFormatVersion & 0xFF00) >> 8,
501
(ArchiveFormatVersion & 0xFF0000) >> 16,
502
(ArchiveFormatVersion & 0xFF000000) >> 24);
505
m_FileStream->Serialize((char*) &TimeStamp.m_Year, sizeof(TimeStamp.m_Year));
506
m_FileStream->Serialize((char*) &TimeStamp.m_Month, sizeof(TimeStamp.m_Month));
507
m_FileStream->Serialize((char*) &TimeStamp.m_Day, sizeof(TimeStamp.m_Day));
508
m_FileStream->Serialize((char*) &TimeStamp.m_Hour, sizeof(TimeStamp.m_Hour));
509
m_FileStream->Serialize((char*) &TimeStamp.m_Minute, sizeof(TimeStamp.m_Minute));
510
m_FileStream->Serialize((char*) &TimeStamp.m_Second, sizeof(TimeStamp.m_Second));
511
m_FileStream->Serialize((char*) &TimeStamp.m_MicroSecond, sizeof(TimeStamp.m_MicroSecond));
512
nuxDebugMsg(TEXT("File created on: %d/%d/%d at %d:%d:%d"), TimeStamp.m_Year, TimeStamp.m_Month, TimeStamp.m_Day, TimeStamp.m_Hour, TimeStamp.m_Minute, TimeStamp.m_Second);
515
m_FileStream->Serialize((char*) &TimeStamp.m_Year, sizeof(TimeStamp.m_Year));
516
m_FileStream->Serialize((char*) &TimeStamp.m_Month, sizeof(TimeStamp.m_Month));
517
m_FileStream->Serialize((char*) &TimeStamp.m_Day, sizeof(TimeStamp.m_Day));
518
m_FileStream->Serialize((char*) &TimeStamp.m_Hour, sizeof(TimeStamp.m_Hour));
519
m_FileStream->Serialize((char*) &TimeStamp.m_Minute, sizeof(TimeStamp.m_Minute));
520
m_FileStream->Serialize((char*) &TimeStamp.m_Second, sizeof(TimeStamp.m_Second));
521
m_FileStream->Serialize((char*) &TimeStamp.m_MicroSecond, sizeof(TimeStamp.m_MicroSecond));
522
nuxDebugMsg(TEXT("Last modified on: %d/%d/%d at %d:%d:%d"), TimeStamp.m_Year, TimeStamp.m_Month, TimeStamp.m_Day, TimeStamp.m_Hour, TimeStamp.m_Minute, TimeStamp.m_Second);
524
// Number of Textures in the archives
525
m_FileStream->Serialize((char*) &m_NumberOfTextures, sizeof(m_NumberOfTextures));
530
void NTextureArchiveManager::PrintArchiveContent(const TCHAR* TextureArchiveFilename)
533
m_FileStream->Close();
534
m_FileStream = GFileManager.CreateFileReader(TextureArchiveFilename, NSerializer::NoOverWrite|NSerializer::Read|NSerializer::Write);
537
PointToFirstTexture();
538
for(unsigned int i = 0; i < m_NumberOfTextures; i++)
540
TextureArchiveInfo_ver_0_0_1 TextureArchiveInfo;
541
TextureArchiveGetInfo_ver_0_0_1(m_FileStream, TextureArchiveInfo);
542
nuxDebugMsg(TEXT("File: %s"), ANSI_TO_TCHAR(TextureArchiveInfo.Name.GetTCharPtr()));
543
nuxDebugMsg(TEXT("---------------------------------------------"));
544
nuxDebugMsg(TEXT(" Type: %s"), (TextureArchiveInfo.Type == ARCH_TEXTURE2D) ? TEXT("Texture2D") :
545
(TextureArchiveInfo.Type == ARCH_CUBEMAP) ? TEXT("Cubemap Texture") :
546
(TextureArchiveInfo.Type == ARCH_VOLUME) ? TEXT("Volume Texture") :
547
TEXT("Unknown Texture") );
548
nuxDebugMsg(TEXT(" Format: %s"), GPixelFormats[TextureArchiveInfo.Format].Name);
549
nuxDebugMsg(TEXT(" Width: %d"), TextureArchiveInfo.Width);
550
nuxDebugMsg(TEXT(" Height: %d"), TextureArchiveInfo.Height);
551
nuxDebugMsg(TEXT(" Depth: %d"), TextureArchiveInfo.Depth);
552
nuxDebugMsg(TEXT(" NumMipmap: %d"), TextureArchiveInfo.NumMipmap);
553
nuxDebugMsg(TEXT(" Size: %d"), TextureArchiveInfo.Size);
556
CloseTextureArchiveFile();
560
void NTextureArchiveManager::TraverseTextures(const TCHAR* TextureArchiveFilename)
563
m_FileStream->Close();
564
m_FileStream = GFileManager.CreateFileReader(TextureArchiveFilename, NSerializer::NoOverWrite|NSerializer::Read|NSerializer::Write);
566
PointToFirstTexture();
567
for(unsigned int i = 0; i < m_NumberOfTextures; i++)
569
unsigned int Offset = m_FileStream->Tell();
570
TextureArchiveLoad_ver_0_0_1(m_FileStream, Offset);
573
CloseTextureArchiveFile();
576
NBitmapData* NTextureArchiveManager::LoadBitmapArchive(const TCHAR* TextureArchiveFilename, const TCHAR* Filename)
579
m_FileStream->Close();
580
m_FileStream = GFileManager.CreateFileReader(TextureArchiveFilename, NSerializer::NoOverWrite|NSerializer::Read|NSerializer::Write);
582
PointToFirstTexture();
583
for(unsigned int i = 0; i < m_NumberOfTextures; i++)
585
TextureArchiveInfo_ver_0_0_1 TextureArchiveInfo;
586
TextureArchiveGetInfo_ver_0_0_1(m_FileStream, TextureArchiveInfo);
587
if(Stricmp(Filename, TextureArchiveInfo.Name.GetTCharPtr()) == 0)
589
return TextureArchiveLoad_ver_0_0_1(m_FileStream, TextureArchiveInfo.FilePointer);
593
CloseTextureArchiveFile();