aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/tools/mesh_extractor/ADT.cpp2
-rw-r--r--src/tools/mesh_extractor/CMakeLists.txt2
-rw-r--r--src/tools/mesh_extractor/Chunk.cpp16
-rw-r--r--src/tools/mesh_extractor/Chunk.h8
-rw-r--r--src/tools/mesh_extractor/ChunkedData.cpp37
-rw-r--r--src/tools/mesh_extractor/ChunkedData.h5
-rw-r--r--src/tools/mesh_extractor/DBC.cpp37
-rw-r--r--src/tools/mesh_extractor/DBC.h4
-rw-r--r--src/tools/mesh_extractor/DoodadHandler.cpp31
-rw-r--r--src/tools/mesh_extractor/DoodadHandler.h17
-rw-r--r--src/tools/mesh_extractor/LiquidHandler.cpp20
-rw-r--r--src/tools/mesh_extractor/MPQ.cpp14
-rw-r--r--src/tools/mesh_extractor/MPQ.h9
-rw-r--r--src/tools/mesh_extractor/MPQManager.cpp29
-rw-r--r--src/tools/mesh_extractor/MPQManager.h7
-rw-r--r--src/tools/mesh_extractor/MapChunk.cpp14
-rw-r--r--src/tools/mesh_extractor/MapChunk.h2
-rw-r--r--src/tools/mesh_extractor/MeshExtractor.cpp1
-rw-r--r--src/tools/mesh_extractor/Model.cpp31
-rw-r--r--src/tools/mesh_extractor/Model.h3
-rw-r--r--src/tools/mesh_extractor/Stream.cpp47
-rw-r--r--src/tools/mesh_extractor/Stream.h53
-rw-r--r--src/tools/mesh_extractor/TileBuilder.cpp2
-rw-r--r--src/tools/mesh_extractor/Utils.cpp424
-rw-r--r--src/tools/mesh_extractor/Utils.h44
-rw-r--r--src/tools/mesh_extractor/WDT.cpp14
-rw-r--r--src/tools/mesh_extractor/WorldModelGroup.cpp45
-rw-r--r--src/tools/mesh_extractor/WorldModelHandler.cpp46
-rw-r--r--src/tools/mesh_extractor/WorldModelHandler.h2
-rw-r--r--src/tools/mesh_extractor/WorldModelRoot.cpp14
30 files changed, 468 insertions, 512 deletions
diff --git a/src/tools/mesh_extractor/ADT.cpp b/src/tools/mesh_extractor/ADT.cpp
index 79ece1213d4..3d3fbdd6365 100644
--- a/src/tools/mesh_extractor/ADT.cpp
+++ b/src/tools/mesh_extractor/ADT.cpp
@@ -8,7 +8,7 @@ ADT::ADT( std::string file, int x, int y ) : ObjectData(NULL), Data(NULL), HasOb
{
Data = new ChunkedData(file);
ObjectData = new ChunkedData(file);
- if (ObjectData->Stream)
+ if (ObjectData->_Stream)
HasObjectData = true;
else
ObjectData = NULL;
diff --git a/src/tools/mesh_extractor/CMakeLists.txt b/src/tools/mesh_extractor/CMakeLists.txt
index 9ed8472051d..f5dbb0fd7ff 100644
--- a/src/tools/mesh_extractor/CMakeLists.txt
+++ b/src/tools/mesh_extractor/CMakeLists.txt
@@ -47,4 +47,4 @@ if( UNIX )
install(TARGETS MeshExtractor DESTINATION bin)
elseif( WIN32 )
install(TARGETS MeshExtractor DESTINATION "${CMAKE_INSTALL_PREFIX}")
-endif()
+endif() \ No newline at end of file
diff --git a/src/tools/mesh_extractor/Chunk.cpp b/src/tools/mesh_extractor/Chunk.cpp
index 4605ae0f0dd..a89bb5cadce 100644
--- a/src/tools/mesh_extractor/Chunk.cpp
+++ b/src/tools/mesh_extractor/Chunk.cpp
@@ -8,24 +8,24 @@ int32 Chunk::FindSubChunkOffset(std::string name)
if (name.size() != 4)
return -1;
- FILE* stream = GetStream();
+ Stream* stream = GetStream();
uint32 matched = 0;
- while (uint32(ftell(stream)) < Utils::Size(stream))
+ while (stream->GetPos() < stream->GetSize())
{
- char b = 0;
- if (fread(&b, sizeof(char), 1, stream) != 1 || b != name[matched])
+ char b = stream->Read<char>();
+ if (b != name[matched])
matched = 0;
else
++matched;
if (matched == 4)
- return ftell(stream) - 4;
+ return stream->GetPos() - 4;
}
return -1;
}
-FILE* Chunk::GetStream()
+Stream* Chunk::GetStream()
{
- fseek(Stream, Offset, SEEK_SET);
- return Stream;
+ _Stream->Seek(Offset, SEEK_SET);
+ return _Stream;
}
diff --git a/src/tools/mesh_extractor/Chunk.h b/src/tools/mesh_extractor/Chunk.h
index f3681a9f576..917a85531da 100644
--- a/src/tools/mesh_extractor/Chunk.h
+++ b/src/tools/mesh_extractor/Chunk.h
@@ -2,19 +2,21 @@
#define CHUNK_H
#include "Define.h"
#include <string>
+#include "Stream.h"
+
class ChunkedData;
class Chunk
{
public:
- Chunk(const char* name, uint32 length, uint32 offset, FILE* stream) : Name(name), Length(length), Offset(offset), Stream(stream) {}
+ Chunk(const char* name, uint32 length, uint32 offset, Stream* stream) : Name(name), Length(length), Offset(offset), _Stream(stream) {}
int32 FindSubChunkOffset(std::string name);
- FILE* GetStream();
+ Stream* GetStream();
std::string Name;
uint32 Length;
uint32 Offset;
- FILE* Stream;
+ Stream* _Stream;
};
#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/ChunkedData.cpp b/src/tools/mesh_extractor/ChunkedData.cpp
index f273ef946dd..cec6dae7fbe 100644
--- a/src/tools/mesh_extractor/ChunkedData.cpp
+++ b/src/tools/mesh_extractor/ChunkedData.cpp
@@ -4,18 +4,18 @@
#include <string>
-ChunkedData::ChunkedData( FILE* stream, uint32 maxLength, uint32 chunksHint /*= 300*/ ) :
-Stream(stream)
+ChunkedData::ChunkedData(Stream* stream, uint32 maxLength, uint32 chunksHint /*= 300*/ ) :
+_Stream(stream)
{
- if (!Stream)
+ if (!_Stream)
return;
Load(maxLength, chunksHint);
}
ChunkedData::ChunkedData( const std::string& file, uint32 chunksHint /*= 300*/ )
{
- Stream = MPQHandler->GetFile(file);
- if (!Stream)
+ _Stream = MPQHandler->GetFile(file);
+ if (!_Stream)
return;
Load(0, chunksHint);
}
@@ -23,27 +23,26 @@ ChunkedData::ChunkedData( const std::string& file, uint32 chunksHint /*= 300*/ )
void ChunkedData::Load( uint32 maxLength, uint32 chunksHint )
{
if (!maxLength)
- maxLength = Utils::Size(Stream);
+ maxLength = _Stream->GetSize();
Chunks.reserve(chunksHint);
- uint32 baseOffset = ftell(Stream);
+ uint32 baseOffset = _Stream->GetPos();
uint32 calcOffset = 0;
- while ((calcOffset + baseOffset) < Utils::Size(Stream) && (calcOffset < maxLength))
+ while ((calcOffset + baseOffset) < _Stream->GetSize() && (calcOffset < maxLength))
{
char nameBytes[5];
- uint32 read = fread(&nameBytes, sizeof(char), 4, Stream);
- nameBytes[read] = '\0';
+ _Stream->Read(nameBytes, sizeof(char) * 4);
+ nameBytes[4] = '\0';
std::string name = std::string(nameBytes);
- // Utils::Reverse(nameBytes);
name = std::string(name.rbegin(), name.rend());
- uint32 length;
- if (fread(&length, sizeof(uint32), 1, Stream) != 1)
- continue;
+
+ uint32 length = _Stream->Read<uint32>();
calcOffset += 8;
- Chunks.push_back(new Chunk(name.c_str(), length, calcOffset + baseOffset, Stream));
+
+ Chunks.push_back(new Chunk(name.c_str(), length, calcOffset + baseOffset, _Stream));
calcOffset += length;
// save an extra seek at the end
- if ((calcOffset + baseOffset) < Utils::Size(Stream) && calcOffset < maxLength)
- fseek(Stream, length, SEEK_CUR);
+ if ((calcOffset + baseOffset) < _Stream->GetSize() && calcOffset < maxLength)
+ _Stream->Seek(length, SEEK_CUR);
}
}
@@ -69,6 +68,6 @@ ChunkedData::~ChunkedData()
delete *itr;
Chunks.clear();
- if (Stream)
- fclose(Stream);
+ if (_Stream)
+ delete _Stream;
}
diff --git a/src/tools/mesh_extractor/ChunkedData.h b/src/tools/mesh_extractor/ChunkedData.h
index 1e1cb17749e..1b47b54f272 100644
--- a/src/tools/mesh_extractor/ChunkedData.h
+++ b/src/tools/mesh_extractor/ChunkedData.h
@@ -3,11 +3,12 @@
#include <vector>
#include "Chunk.h"
+#include "Stream.h"
class ChunkedData
{
public:
- ChunkedData(FILE* stream, uint32 maxLength, uint32 chunksHint = 300);
+ ChunkedData(Stream* stream, uint32 maxLength, uint32 chunksHint = 300);
ChunkedData(const std::string &file, uint32 chunksHint = 300);
~ChunkedData();
@@ -16,6 +17,6 @@ public:
void Load(uint32 maxLength, uint32 chunksHint);
std::vector<Chunk*> Chunks;
- FILE* Stream;
+ Stream* _Stream;
};
#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/DBC.cpp b/src/tools/mesh_extractor/DBC.cpp
index 281a11d10dc..52e4d8c3760 100644
--- a/src/tools/mesh_extractor/DBC.cpp
+++ b/src/tools/mesh_extractor/DBC.cpp
@@ -2,19 +2,15 @@
#include "DBC.h"
#include "Define.h"
-DBC::DBC( FILE* stream ) : StringBlock(NULL), StringBlockSize(0), IsFaulty(true)
+DBC::DBC(Stream* stream) : StringBlock(NULL), StringBlockSize(0), IsFaulty(true)
{
- char magic[5];
- uint32 count = 0;
- count += fread(&magic, sizeof(char), 4, stream);
- magic[4] = '\0';
- count += fread(&RecordCount, sizeof(uint32), 1, stream);
+ stream->Read(4); // Read the magic "WDBC"
+
+ RecordCount = stream->Read<int>();
Records.reserve(RecordCount);
- count += fread(&Fields, sizeof(uint32), 1, stream);
- count += fread(&RecordSize, sizeof(uint32), 1, stream);
- count += fread(&StringBlockSize, sizeof(uint32), 1, stream);
- if (count != 8)
- printf("DBC::DBC: Failed to read some data expected 8, read %u\n", count);
+ Fields = stream->Read<int>();
+ RecordSize = stream->Read<int>();
+ StringBlockSize = stream->Read<uint32>();
for (int i = 0; i < RecordCount; i++)
{
@@ -28,17 +24,18 @@ DBC::DBC( FILE* stream ) : StringBlock(NULL), StringBlockSize(0), IsFaulty(true)
IsFaulty = true;
break;
}
- uint32 tmp;
- if (fread(&tmp, sizeof(uint32), 1, stream) != 1)
- printf("DBC::DBC: Failed to read some data expected 1, read 0\n");
- rec->Values.push_back(tmp);
+ rec->Values.push_back(stream->Read<uint32>());
size += 4;
}
}
- StringBlock = new uint8[StringBlockSize];
- count = fread(StringBlock, sizeof(uint8), StringBlockSize, stream);
- if (count != StringBlockSize)
- printf("DBC::DBC: Failed to read some data expected %u, read %u\n", StringBlockSize, count);
+ StringBlock = (uint8*)stream->Read(StringBlockSize);
+}
+
+DBC::~DBC()
+{
+ delete[] StringBlock;
+ for (std::vector<Record*>::iterator itr = Records.begin(); itr != Records.end(); ++itr)
+ delete *itr;
}
std::string DBC::GetStringByOffset( int offset )
@@ -56,7 +53,7 @@ std::string DBC::GetStringByOffset( int offset )
strcpy(d, (const char*)(StringBlock + offset));
d[len] = '\0';
std::string val = std::string(d);
- delete [] d;
+ delete[] d;
return val;
}
diff --git a/src/tools/mesh_extractor/DBC.h b/src/tools/mesh_extractor/DBC.h
index 5ed57754e73..339e896949d 100644
--- a/src/tools/mesh_extractor/DBC.h
+++ b/src/tools/mesh_extractor/DBC.h
@@ -3,13 +3,15 @@
#include <vector>
#include <string>
#include "Define.h"
+#include "Stream.h"
class Record;
class DBC
{
public:
- DBC(FILE* stream);
+ DBC(Stream* stream);
+ ~DBC();
std::string GetStringByOffset(int offset);
diff --git a/src/tools/mesh_extractor/DoodadHandler.cpp b/src/tools/mesh_extractor/DoodadHandler.cpp
index 72c051500e1..4619f418e55 100644
--- a/src/tools/mesh_extractor/DoodadHandler.cpp
+++ b/src/tools/mesh_extractor/DoodadHandler.cpp
@@ -17,20 +17,18 @@ DoodadHandler::DoodadHandler( ADT* adt ) :
ReadDoodadPaths(mmid, mmdx);
}
-void DoodadHandler::ProcessInternal( MapChunk* mcnk )
+void DoodadHandler::ProcessInternal(MapChunk* mcnk)
{
if (!IsSane())
return;
uint32 refCount = mcnk->Header.DoodadRefs;
- FILE* stream = mcnk->Source->GetStream();
- fseek(stream, mcnk->Source->Offset + mcnk->Header.OffsetMCRF, SEEK_SET);
+ Stream* stream = mcnk->Source->GetStream();
+ stream->Seek(mcnk->Source->Offset + mcnk->Header.OffsetMCRF, SEEK_SET);
+
for (uint32 i = 0; i < refCount; i++)
{
- int32 index;
- int32 count;
- if ((count = fread(&index, sizeof(int32), 1, stream)) != 1)
- printf("DoodadHandler::ProcessInternal: Failed to read some data expected 1, read %d\n", count);
+ int32 index = stream->Read<int32>();
if (index < 0 || uint32(index) >= _definitions->size())
continue;
DoodadDefinition doodad = (*_definitions)[index];
@@ -56,7 +54,7 @@ void DoodadHandler::ProcessInternal( MapChunk* mcnk )
InsertModelGeometry(doodad, model);
}
// Restore the stream position
- fseek(stream, mcnk->Source->Offset, SEEK_SET);
+ stream->Seek(mcnk->Source->Offset, SEEK_SET);
}
void DoodadHandler::ReadDoodadDefinitions( Chunk* chunk )
@@ -64,7 +62,7 @@ void DoodadHandler::ReadDoodadDefinitions( Chunk* chunk )
int32 count = chunk->Length / 36;
_definitions = new std::vector<DoodadDefinition>;
_definitions->reserve(count);
- FILE* stream = chunk->GetStream();
+ Stream* stream = chunk->GetStream();
for (int i = 0; i < count; i++)
{
DoodadDefinition def;
@@ -80,14 +78,13 @@ void DoodadHandler::ReadDoodadPaths( Chunk* id, Chunk* data )
_paths->reserve(paths);
for (int i = 0; i < paths; i++)
{
- FILE* idStream = id->GetStream();
- fseek(idStream, i * 4, SEEK_CUR);
- uint32 offset;
- if (fread(&offset, sizeof(uint32), 1, idStream) != 1)
- printf("DoodadHandler::ReadDoodadPaths: Failed to read some data expected 1, read 0\n");
- FILE* dataStream = data->GetStream();
- fseek(dataStream, offset + data->Offset, SEEK_SET);
- _paths->push_back(Utils::ReadString(dataStream));
+ Stream* idStream = id->GetStream();
+ idStream->Seek(i * 4, SEEK_CUR);
+ uint32 offset = idStream->Read<uint32>();
+
+ Stream* dataStream = data->GetStream();
+ dataStream->Seek(offset + data->Offset, SEEK_SET);
+ _paths->push_back(dataStream->ReadString());
}
}
diff --git a/src/tools/mesh_extractor/DoodadHandler.h b/src/tools/mesh_extractor/DoodadHandler.h
index 51377f32d01..fcf8c2ede28 100644
--- a/src/tools/mesh_extractor/DoodadHandler.h
+++ b/src/tools/mesh_extractor/DoodadHandler.h
@@ -4,6 +4,7 @@
#include "Utils.h"
#include "Chunk.h"
#include "Model.h"
+#include "Stream.h"
#include <set>
#include <vector>
@@ -22,18 +23,14 @@ public:
return Vector3(vec.z, vec.x, vec.y);
}
- void Read(FILE* stream)
+ void Read(Stream* stream)
{
- int count = 0;
-
- count += fread(&MmidIndex, sizeof(uint32), 1, stream);
- count += fread(&UniqueId, sizeof(uint32), 1, stream);
- Position = (Vector3::Read(stream));
+ MmidIndex = stream->Read<uint32>();
+ UniqueId = stream->Read<uint32>();
+ Position = Vector3::Read(stream);
Rotation = Vector3::Read(stream);
- count += fread(&DecimalScale, sizeof(uint16), 1, stream);
- count += fread(&Flags, sizeof(uint16), 1, stream);
- if (count != 4)
- printf("DoodadDefinition::Read: Failed to read some data expected 4, read %d\n", count);
+ DecimalScale = stream->Read<uint16>();
+ Flags = stream->Read<uint16>();
}
};
diff --git a/src/tools/mesh_extractor/LiquidHandler.cpp b/src/tools/mesh_extractor/LiquidHandler.cpp
index 33a661a9adf..6317748ea23 100644
--- a/src/tools/mesh_extractor/LiquidHandler.cpp
+++ b/src/tools/mesh_extractor/LiquidHandler.cpp
@@ -15,7 +15,7 @@ void LiquidHandler::HandleNewLiquid()
Vertices.reserve(1000);
Triangles.reserve(1000);
- FILE* stream = chunk->GetStream();
+ Stream* stream = chunk->GetStream();
H2OHeader header[256];
MCNKData.reserve(256);
for (int i = 0; i < 256; i++)
@@ -30,7 +30,7 @@ void LiquidHandler::HandleNewLiquid()
MCNKData.push_back(MCNKLiquidData(NULL, H2ORenderMask()));
continue;
}
- fseek(stream, chunk->Offset + h.OffsetInformation, SEEK_SET);
+ stream->Seek(chunk->Offset + h.OffsetInformation, SEEK_SET);
H2OInformation information = H2OInformation::Read(stream);
float** heights = new float*[9];
@@ -43,24 +43,22 @@ void LiquidHandler::HandleNewLiquid()
H2ORenderMask renderMask;
if (information.LiquidType != 2)
{
- fseek(stream, chunk->Offset + h.OffsetRender, SEEK_SET);
+ stream->Seek(chunk->Offset + h.OffsetRender, SEEK_SET);
renderMask = H2ORenderMask::Read(stream);
if ((Utils::IsAllZero(renderMask.Mask, 8) || (information.Width == 8 && information.Height == 8)) && information.OffsetMask2)
{
- fseek(stream, chunk->Offset + information.OffsetMask2, SEEK_SET);
+ stream->Seek(chunk->Offset + information.OffsetMask2, SEEK_SET);
uint32 size = ceil(information.Width * information.Height / 8.0f);
- uint8* altMask = new uint8[size];
- if (fread(altMask, sizeof(uint8), size, stream) == size)
- for (uint32 mi = 0; mi < size; mi++)
- renderMask.Mask[mi + information.OffsetY] |= altMask[mi];
+ uint8* altMask = (uint8*)stream->Read(size);
+ for (uint32 mi = 0; mi < size; mi++)
+ renderMask.Mask[mi + information.OffsetY] |= altMask[mi];
delete[] altMask;
}
- fseek(stream, chunk->Offset + information.OffsetHeightmap, SEEK_SET);
+ stream->Seek(chunk->Offset + information.OffsetHeightmap, SEEK_SET);
for (int y = information.OffsetY; y < (information.OffsetY + information.Height); y++)
for (int x = information.OffsetX; x < (information.OffsetX + information.Width); x++)
- if (fread(&heights[x][y], sizeof(float), 1, stream) != 1)
- return;
+ heights[x][y] = stream->Read<float>();
}
else
{
diff --git a/src/tools/mesh_extractor/MPQ.cpp b/src/tools/mesh_extractor/MPQ.cpp
index 896d7bc32ac..5e822a6835c 100644
--- a/src/tools/mesh_extractor/MPQ.cpp
+++ b/src/tools/mesh_extractor/MPQ.cpp
@@ -1,5 +1,6 @@
#include "MPQ.h"
#include "MPQManager.h"
+#include "Stream.h"
#include <deque>
#include <cstdio>
@@ -108,15 +109,8 @@ void MPQFile::close()
eof = true;
}
-FILE* MPQFile::GetFileStream()
+Stream* MPQFile::GetFileStream()
{
- FILE* file = tmpfile();
- if (!file)
- {
- printf("Could not create temporary file. Please run as Administrator or root\n");
- exit(1);
- }
- fwrite(buffer, sizeof(char), size, file);
- fseek(file, 0, SEEK_SET);
- return file;
+ Stream* stream = new Stream(buffer, size);
+ return stream;
}
diff --git a/src/tools/mesh_extractor/MPQ.h b/src/tools/mesh_extractor/MPQ.h
index 30e11741550..d548f16adc1 100644
--- a/src/tools/mesh_extractor/MPQ.h
+++ b/src/tools/mesh_extractor/MPQ.h
@@ -3,6 +3,7 @@
#include "libmpq/mpq.h"
#include "Define.h"
+#include "Stream.h"
#include <string>
#include <ctype.h>
#include <vector>
@@ -13,7 +14,7 @@ class MPQArchive
{
public:
- mpq_archive_s *mpq_a;
+ mpq_archive_s* mpq_a;
std::vector<std::string> Files;
@@ -53,8 +54,8 @@ class MPQFile
{
//MPQHANDLE handle;
bool eof;
- char *buffer;
- libmpq__off_t pointer,size;
+ char* buffer;
+ libmpq__off_t pointer, size;
// disable copying
MPQFile(const MPQFile& /*f*/) {}
@@ -64,7 +65,7 @@ public:
MPQFile(const char* filename); // filenames are not case sensitive
~MPQFile() { close(); }
size_t Read(void* dest, size_t bytes);
- FILE* GetFileStream();
+ Stream* GetFileStream();
size_t getSize() { return size; }
size_t getPos() { return pointer; }
char* getBuffer() { return buffer; }
diff --git a/src/tools/mesh_extractor/MPQManager.cpp b/src/tools/mesh_extractor/MPQManager.cpp
index 950e284f92e..cd98a5e017b 100644
--- a/src/tools/mesh_extractor/MPQManager.cpp
+++ b/src/tools/mesh_extractor/MPQManager.cpp
@@ -2,6 +2,7 @@
#include "MPQ.h"
#include "DBC.h"
#include "Utils.h"
+#include "Stream.h"
#include <ace/Guard_T.h>
char const* MPQManager::Files[] = {
@@ -83,7 +84,7 @@ void MPQManager::InitializeDBC()
printf("Using default locale: %s\n", Languages[BaseLocale]);
}
-FILE* MPQManager::GetFile(const std::string& path )
+Stream* MPQManager::GetFile(const std::string& path )
{
ACE_GUARD_RETURN(ACE_Thread_Mutex, g, mutex, NULL);
MPQFile file(path.c_str());
@@ -98,11 +99,11 @@ DBC* MPQManager::GetDBC(const std::string& name )
return new DBC(GetFile(path));
}
-FILE* MPQManager::GetFileFromLocale( const std::string& path, uint32 locale )
+Stream* MPQManager::GetFileFromLocale( const std::string& path, uint32 locale )
{
ACE_GUARD_RETURN(ACE_Thread_Mutex, g, mutex, NULL);
std::deque<MPQArchive*> files = LocaleFiles[locale];
- FILE* ret = NULL;
+ Stream* ret = NULL;
for (std::deque<MPQArchive*>::iterator itr = files.begin(); itr != files.end(); ++itr)
{
mpq_archive* mpq_a = (*itr)->mpq_a;
@@ -123,22 +124,15 @@ FILE* MPQManager::GetFileFromLocale( const std::string& path, uint32 locale )
//libmpq_file_getdata
libmpq__file_read(mpq_a, filenum, (unsigned char*)buffer, size, &transferred);
- // Pack the return into a FILE stream
- ret = tmpfile();
- if (!ret)
- {
- printf("Could not create temporary file. Please run as Administrator or root\n");
- exit(1);
- }
- fwrite(buffer, sizeof(uint8), size, ret);
- fseek(ret, 0, SEEK_SET);
+ ret = new Stream(buffer, size);
+
delete[] buffer;
break;
}
return ret;
}
-FILE* MPQManager::GetFileFrom(const std::string& path, MPQArchive* file )
+Stream* MPQManager::GetFileFrom(const std::string& path, MPQArchive* file )
{
ACE_GUARD_RETURN(ACE_Thread_Mutex, g, mutex, NULL);
mpq_archive* mpq_a = file->mpq_a;
@@ -161,14 +155,7 @@ FILE* MPQManager::GetFileFrom(const std::string& path, MPQArchive* file )
libmpq__file_read(mpq_a, filenum, (unsigned char*)buffer, size, &transferred);
// Pack the return into a FILE stream
- FILE* ret = tmpfile();
- if (!ret)
- {
- printf("Could not create temporary file. Please run as Administrator or root\n");
- exit(1);
- }
- fwrite(buffer, sizeof(uint8), size, ret);
- fseek(ret, 0, SEEK_SET);
+ Stream* ret = new Stream((char*)buffer, size);
delete[] buffer;
return ret;
}
diff --git a/src/tools/mesh_extractor/MPQManager.h b/src/tools/mesh_extractor/MPQManager.h
index 3514674b9bf..3fd27b6bffd 100644
--- a/src/tools/mesh_extractor/MPQManager.h
+++ b/src/tools/mesh_extractor/MPQManager.h
@@ -2,6 +2,7 @@
#define MPQ_MANAGER_H
#include "MPQ.h"
+#include "Stream.h"
#include <ace/Synch.h>
#include <set>
#include <map>
@@ -14,9 +15,9 @@ public:
~MPQManager() {}
void Initialize();
- FILE* GetFile(const std::string& path);
- FILE* GetFileFrom(const std::string& path, MPQArchive* file);
- FILE* GetFileFromLocale(const std::string& path, uint32 locale);
+ Stream* GetFile(const std::string& path);
+ Stream* GetFileFrom(const std::string& path, MPQArchive* file);
+ Stream* GetFileFromLocale(const std::string& path, uint32 locale);
DBC* GetDBC(const std::string& name);
std::vector<std::string> GetAllFiles(std::string extension);
diff --git a/src/tools/mesh_extractor/MapChunk.cpp b/src/tools/mesh_extractor/MapChunk.cpp
index 789166d5c9b..ffed64b13af 100644
--- a/src/tools/mesh_extractor/MapChunk.cpp
+++ b/src/tools/mesh_extractor/MapChunk.cpp
@@ -4,9 +4,9 @@
MapChunk::MapChunk( ADT* _adt, Chunk* chunk ) : Adt(_adt), Source(chunk)
{
- FILE* stream = chunk->GetStream();
+ Stream* stream = chunk->GetStream();
Header.Read(stream);
- fseek(stream, chunk->Offset, SEEK_SET);
+ stream->Seek(chunk->Offset, SEEK_SET);
Index = Header.IndexX + Header.IndexY * 16;
GenerateVertices(stream);
}
@@ -47,9 +47,9 @@ void MapChunk::GenerateTriangles()
}
}
-void MapChunk::GenerateVertices( FILE* stream )
+void MapChunk::GenerateVertices(Stream* stream)
{
- fseek(stream, Header.OffsetMCVT, SEEK_CUR);
+ stream->Seek(Header.OffsetMCVT, SEEK_CUR);
Vertices.reserve(125);
for (int j = 0; j < 17; j++)
@@ -57,9 +57,7 @@ void MapChunk::GenerateVertices( FILE* stream )
int values = j % 2 ? 8 : 9;
for (int i = 0; i < values; i++)
{
- float tmp;
- if (fread(&tmp, sizeof(float), 1, stream) != 1)
- printf("MapChunk::GenerateVertices: Failed to read some data expected 1, read 0\n");
+ float tmp = stream->Read<float>();
Vector3 vert(Header.Position.x - (j * (Constants::UnitSize * 0.5f)), Header.Position.y - (i * Constants::UnitSize), Header.Position.z + tmp);
if (values == 8)
vert.y -= Constants::UnitSize * 0.5f;
@@ -67,7 +65,7 @@ void MapChunk::GenerateVertices( FILE* stream )
}
}
// Restore stream position.
- fseek(stream, Source->Offset, SEEK_SET);
+ stream->Seek(Source->Offset, SEEK_SET);
}
bool MapChunk::HasHole( uint32 map, int x, int y )
diff --git a/src/tools/mesh_extractor/MapChunk.h b/src/tools/mesh_extractor/MapChunk.h
index e7d835ae0e3..a317c3a371b 100644
--- a/src/tools/mesh_extractor/MapChunk.h
+++ b/src/tools/mesh_extractor/MapChunk.h
@@ -12,7 +12,7 @@ public:
MapChunk(ADT* _adt, Chunk* chunk);
void GenerateTriangles();
- void GenerateVertices(FILE* stream);
+ void GenerateVertices(Stream* stream);
static bool HasHole(uint32 map, int x, int y);
ADT* Adt;
Chunk* Source;
diff --git a/src/tools/mesh_extractor/MeshExtractor.cpp b/src/tools/mesh_extractor/MeshExtractor.cpp
index 1ed09e5d9dc..22afa763099 100644
--- a/src/tools/mesh_extractor/MeshExtractor.cpp
+++ b/src/tools/mesh_extractor/MeshExtractor.cpp
@@ -352,7 +352,6 @@ void LoadTile(dtNavMesh*& navMesh, const char* tile)
int main(int argc, char* argv[])
{
- _setmaxstdio(2048);
uint32 threads = 4, extractFlags = 0;
std::set<uint32> mapIds;
diff --git a/src/tools/mesh_extractor/Model.cpp b/src/tools/mesh_extractor/Model.cpp
index 5fb521d5a36..0b21ad1027d 100644
--- a/src/tools/mesh_extractor/Model.cpp
+++ b/src/tools/mesh_extractor/Model.cpp
@@ -2,15 +2,15 @@
#include "MPQManager.h"
#include "Utils.h"
-Model::Model( std::string path ) : IsCollidable(false), IsBad(false)
+Model::Model(std::string path) : IsCollidable(false), IsBad(false)
{
- Stream = MPQHandler->GetFile(Utils::FixModelPath(path));
- if (!Stream)
+ _Stream = MPQHandler->GetFile(Utils::FixModelPath(path));
+ if (!_Stream)
{
IsBad = true;
return;
}
- Header.Read(Stream);
+ Header.Read(_Stream);
if (Header.OffsetBoundingNormals > 0 && Header.OffsetBoundingVertices > 0 &&
Header.OffsetBoundingTriangles > 0 && Header.BoundingRadius > 0.0f)
{
@@ -23,17 +23,17 @@ Model::Model( std::string path ) : IsCollidable(false), IsBad(false)
Model::~Model()
{
- if (Stream)
- fclose(Stream);
+ if (_Stream)
+ delete _Stream;
}
void Model::ReadVertices()
{
- fseek(Stream, Header.OffsetBoundingVertices, SEEK_SET);
+ _Stream->Seek(Header.OffsetBoundingVertices, SEEK_SET);
Vertices.reserve(Header.CountBoundingVertices);
for (uint32 i = 0; i < Header.CountBoundingVertices; ++i)
{
- Vertices.push_back(Vector3::Read(Stream));
+ Vertices.push_back(Vector3::Read(_Stream));
if (Constants::ToWoWCoords)
Vertices[i] = Utils::ToWoWCoords(Vertices[i]);
}
@@ -41,27 +41,24 @@ void Model::ReadVertices()
void Model::ReadBoundingTriangles()
{
- fseek(Stream, Header.OffsetBoundingTriangles, SEEK_SET);
+ _Stream->Seek(Header.OffsetBoundingTriangles, SEEK_SET);
Triangles.reserve(Header.CountBoundingTriangles / 3);
for (uint32 i = 0; i < Header.CountBoundingTriangles / 3; i++)
{
Triangle<uint16> tri;
tri.Type = Constants::TRIANGLE_TYPE_DOODAD;
- int count = 0;
- count += fread(&tri.V0, sizeof(uint16), 1, Stream);
- count += fread(&tri.V1, sizeof(uint16), 1, Stream);
- count += fread(&tri.V2, sizeof(uint16), 1, Stream);
- if (count != 3)
- printf("Model::ReadBoundingTriangles: Error reading data, expected 3, read %d\n", count);
+ tri.V0 = _Stream->Read<uint16>();
+ tri.V1 = _Stream->Read<uint16>();
+ tri.V2 = _Stream->Read<uint16>();
Triangles.push_back(tri);
}
}
void Model::ReadBoundingNormals()
{
- fseek(Stream, Header.OffsetBoundingNormals, SEEK_SET);
+ _Stream->Seek(Header.OffsetBoundingNormals, SEEK_SET);
Normals.reserve(Header.CountBoundingNormals);
for (uint32 i = 0; i < Header.CountBoundingNormals; i++)
- Normals.push_back(Vector3::Read(Stream));
+ Normals.push_back(Vector3::Read(_Stream));
}
diff --git a/src/tools/mesh_extractor/Model.h b/src/tools/mesh_extractor/Model.h
index ed8627dad6f..fcbdd81145c 100644
--- a/src/tools/mesh_extractor/Model.h
+++ b/src/tools/mesh_extractor/Model.h
@@ -2,6 +2,7 @@
#define MODEL_H
#include <vector>
#include "Utils.h"
+#include "Stream.h"
class Model
{
@@ -17,7 +18,7 @@ public:
std::vector<Vector3> Normals;
std::vector<Triangle<uint16> > Triangles;
bool IsCollidable;
- FILE* Stream;
+ Stream* _Stream;
bool IsBad;
};
#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/Stream.cpp b/src/tools/mesh_extractor/Stream.cpp
new file mode 100644
index 00000000000..f775d97d114
--- /dev/null
+++ b/src/tools/mesh_extractor/Stream.cpp
@@ -0,0 +1,47 @@
+#include "Stream.h"
+#include <iostream>
+
+Stream::Stream(char* buffer, uint32 size) : _size(size), _position(0)
+{
+ _buffer = new char[size];
+ memcpy(_buffer, buffer, size); // Initialize the buffer
+}
+
+Stream::~Stream()
+{
+ delete[] _buffer;
+}
+
+char* Stream::Read(uint32 size)
+{
+ char* buff = new char[size];
+ memcpy(buff, &_buffer[_position], size);
+ _position += size;
+ return buff;
+}
+
+void Stream::Seek(uint32 position, uint32 type)
+{
+ switch (type)
+ {
+ case SEEK_SET:
+ _position = position;
+ break;
+ case SEEK_CUR:
+ _position += position;
+ break;
+ }
+}
+
+std::string Stream::ReadString()
+{
+ std::string str;
+ while (true)
+ {
+ char b = Read<char>();
+ if (b == 0)
+ break;
+ str.push_back(b);
+ }
+ return str;
+} \ No newline at end of file
diff --git a/src/tools/mesh_extractor/Stream.h b/src/tools/mesh_extractor/Stream.h
new file mode 100644
index 00000000000..76d9511bbc4
--- /dev/null
+++ b/src/tools/mesh_extractor/Stream.h
@@ -0,0 +1,53 @@
+#ifndef STREAM_H
+#define STREAM_H
+
+#include "Define.h"
+#include <iostream>
+
+class Stream
+{
+public:
+ Stream(char* buffer, uint32 size);
+ ~Stream();
+
+ template<typename T>
+ T Read()
+ {
+ T ret = *((T*)(&_buffer[_position]));
+ _position += sizeof(T);
+ return ret;
+ }
+
+ template<typename T>
+ void Read(T* dest, uint32 size)
+ {
+ memcpy(dest, &_buffer[_position], size);
+ _position += size;
+ }
+
+ char* Read(uint32 size);
+ std::string ReadString();
+
+ void Reset()
+ {
+ _position = 0;
+ }
+
+ void Seek(uint32 position, uint32 type);
+
+ uint32 GetSize()
+ {
+ return _size;
+ }
+
+ uint32 GetPos()
+ {
+ return _position;
+ }
+
+private:
+ char* _buffer;
+ uint32 _size;
+ uint32 _position;
+};
+#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/TileBuilder.cpp b/src/tools/mesh_extractor/TileBuilder.cpp
index cdc3131b3db..5d82fb17e25 100644
--- a/src/tools/mesh_extractor/TileBuilder.cpp
+++ b/src/tools/mesh_extractor/TileBuilder.cpp
@@ -228,7 +228,7 @@ uint8* TileBuilder::BuildTiled(dtNavMeshParams& navMeshParams)
ADT* _adt = new ADT(Utils::GetAdtPath(World, tx, ty), tx, ty);
// If this condition is met, it means that this WDT does not contain the ADT
- if (!_adt->Data->Stream)
+ if (!_adt->Data->_Stream)
{
delete _adt;
continue;
diff --git a/src/tools/mesh_extractor/Utils.cpp b/src/tools/mesh_extractor/Utils.cpp
index 24cfb5cd1db..834303d164f 100644
--- a/src/tools/mesh_extractor/Utils.cpp
+++ b/src/tools/mesh_extractor/Utils.cpp
@@ -1,6 +1,7 @@
#include "Utils.h"
#include "WorldModelHandler.h"
#include "Constants.h"
+#include "Stream.h"
#include <cstring>
#include "G3D/Matrix4.h"
#include "G3D/Quat.h"
@@ -47,31 +48,6 @@ void Utils::Reverse(char word[])
}
}
-std::string Utils::ReadString( FILE* file )
-{
- std::string ret;
- while (true)
- {
- char b;
- if (fread(&b, sizeof(char), 1, file) != 1 || b == 0)
- break;
- ret.push_back(b);
- }
- return ret;
-}
-
-uint32 Utils::Size( FILE* file )
-{
- // store the old position
- uint32 offset = ftell(file);
- // Get file size
- fseek(file, 0, SEEK_END);
- uint32 size = ftell(file);
- // reset back to the old position
- fseek(file, offset, SEEK_SET);
- return size;
-}
-
Vector3 Utils::ToRecast(const Vector3& val )
{
return Vector3(-val.y, val.z, -val.x);
@@ -136,12 +112,9 @@ std::string Utils::GetPathBase(const std::string& path )
return path;
}
-Vector3 Vector3::Read( FILE* file )
+Vector3 Vector3::Read(Stream* file)
{
- Vector3 ret;
- if (fread(&ret, sizeof(Vector3), 1, file) != 1)
- printf("Vector3::Read: Failed to read some data expected 1, read 0\n");
- return ret;
+ return file->Read<Vector3>();
}
Vector3 Utils::GetLiquidVert(const IDefinition& def, Vector3 basePosition, float height, int x, int y, bool translate)
@@ -167,41 +140,36 @@ std::string Utils::Replace( std::string str, const std::string& oldStr, const st
return str;
}
-void Utils::SaveToDisk( FILE* stream, const std::string& path )
+void Utils::SaveToDisk(Stream* stream, const std::string& path)
{
FILE* disk = fopen(path.c_str(), "wb");
if (!disk)
{
printf("SaveToDisk: Could not save file %s to disk, please verify that you have write permissions on that directory\n", path.c_str());
- fclose(stream);
+ delete stream;
return;
}
- uint32 size = Utils::Size(stream);
- uint8* data = new uint8[size];
- // Read the data to an array
- size_t read = fread(data, size, 1, stream);
- if (read != 1)
- {
- printf("SaveToDisk: Error reading from Stream while trying to save file %s to disk.\n", path.c_str());
- fclose(disk);
- fclose(stream);
- return;
- }
+ uint32 size = stream->GetSize();
+ stream->Reset(); // Reset the stream just in case
+ // Read the data to an array
+ char* data = stream->Read(size);
+
// And write it in the file
size_t wrote = fwrite(data, size, 1, disk);
if (wrote != 1)
{
printf("SaveToDisk: Error writing to the file while trying to save %s to disk.\n", path.c_str());
- fclose(stream);
+ delete[] data;
+ delete stream;
fclose(disk);
return;
}
// Close the filestream
fclose(disk);
- fclose(stream);
+ delete stream;
// Free the used memory
delete[] data;
@@ -222,206 +190,172 @@ std::string Utils::GetExtension( std::string path )
return extension;
}
-void MapChunkHeader::Read(FILE* stream)
-{
- int count = 0;
-
- count += fread(&Flags, sizeof(uint32), 1, stream);
- count += fread(&IndexX, sizeof(uint32), 1, stream);
- count += fread(&IndexY, sizeof(uint32), 1, stream);
- count += fread(&Layers, sizeof(uint32), 1, stream);
- count += fread(&DoodadRefs, sizeof(uint32), 1, stream);
- count += fread(&OffsetMCVT, sizeof(uint32), 1, stream);
- count += fread(&OffsetMCNR, sizeof(uint32), 1, stream);
- count += fread(&OffsetMCLY, sizeof(uint32), 1, stream);
- count += fread(&OffsetMCRF, sizeof(uint32), 1, stream);
- count += fread(&OffsetMCAL, sizeof(uint32), 1, stream);
- count += fread(&SizeMCAL, sizeof(uint32), 1, stream);
- count += fread(&OffsetMCSH, sizeof(uint32), 1, stream);
- count += fread(&SizeMCSH, sizeof(uint32), 1, stream);
- count += fread(&AreaId, sizeof(uint32), 1, stream);
- count += fread(&MapObjectRefs, sizeof(uint32), 1, stream);
- count += fread(&Holes, sizeof(uint32), 1, stream);
+void MapChunkHeader::Read(Stream* stream)
+{
+ Flags = stream->Read<uint32>();
+ IndexX = stream->Read<uint32>();
+ IndexY = stream->Read<uint32>();
+ Layers = stream->Read<uint32>();
+ DoodadRefs = stream->Read<uint32>();
+ OffsetMCVT = stream->Read<uint32>();
+ OffsetMCNR = stream->Read<uint32>();
+ OffsetMCLY = stream->Read<uint32>();
+ OffsetMCRF = stream->Read<uint32>();
+ OffsetMCAL = stream->Read<uint32>();
+ SizeMCAL = stream->Read<uint32>();
+ OffsetMCSH = stream->Read<uint32>();
+ SizeMCSH = stream->Read<uint32>();
+ AreaId = stream->Read<uint32>();
+ MapObjectRefs = stream->Read<uint32>();
+ Holes = stream->Read<uint32>();
LowQualityTextureMap = new uint32[4];
- count += fread(LowQualityTextureMap, sizeof(uint32), 4, stream);
- count += fread(&PredTex, sizeof(uint32), 1, stream);
- count += fread(&NumberEffectDoodad, sizeof(uint32), 1, stream);
- count += fread(&OffsetMCSE, sizeof(uint32), 1, stream);
- count += fread(&SoundEmitters, sizeof(uint32), 1, stream);
- count += fread(&OffsetMCLQ, sizeof(uint32), 1, stream);
- count += fread(&SizeMCLQ, sizeof(uint32), 1, stream);
+ stream->Read(LowQualityTextureMap, sizeof(uint32) * 4);
+ PredTex = stream->Read<uint32>();
+ NumberEffectDoodad = stream->Read<uint32>();
+ OffsetMCSE = stream->Read<uint32>();
+ SoundEmitters = stream->Read<uint32>();
+ OffsetMCLQ = stream->Read<uint32>();
+ SizeMCLQ = stream->Read<uint32>();
Position = Vector3::Read(stream);
- count += fread(&OffsetMCCV, sizeof(uint32), 1, stream);
-
- if (count != 27)
- printf("MapChunkHeader::Read: Failed to read some data expected 27, read %d\n", count);
+ OffsetMCCV = stream->Read<uint32>();
}
-void MHDR::Read(FILE* stream)
+void MHDR::Read(Stream* stream)
{
int count = 0;
- count += fread(&Flags, sizeof(uint32), 1, stream);
- count += fread(&OffsetMCIN, sizeof(uint32), 1, stream);
- count += fread(&OffsetMTEX, sizeof(uint32), 1, stream);
- count += fread(&OffsetMMDX, sizeof(uint32), 1, stream);
- count += fread(&OffsetMMID, sizeof(uint32), 1, stream);
- count += fread(&OffsetMWMO, sizeof(uint32), 1, stream);
- count += fread(&OffsetMWID, sizeof(uint32), 1, stream);
- count += fread(&OffsetMDDF, sizeof(uint32), 1, stream);
- count += fread(&OffsetMODF, sizeof(uint32), 1, stream);
- count += fread(&OffsetMFBO, sizeof(uint32), 1, stream);
- count += fread(&OffsetMH2O, sizeof(uint32), 1, stream);
- count += fread(&OffsetMTFX, sizeof(uint32), 1, stream);
-
- if (count != 12)
- printf("MHDR::Read: Failed to read some data expected 12, read %d\n", count);
+ Flags = stream->Read<uint32>();
+ OffsetMCIN = stream->Read<uint32>();
+ OffsetMTEX = stream->Read<uint32>();
+ OffsetMMDX = stream->Read<uint32>();
+ OffsetMMID = stream->Read<uint32>();
+ OffsetMWMO = stream->Read<uint32>();
+ OffsetMWID = stream->Read<uint32>();
+ OffsetMDDF = stream->Read<uint32>();
+ OffsetMODF = stream->Read<uint32>();
+ OffsetMFBO = stream->Read<uint32>();
+ OffsetMH2O = stream->Read<uint32>();
+ OffsetMTFX = stream->Read<uint32>();
}
-void ModelHeader::Read(FILE* stream)
+void ModelHeader::Read(Stream* stream)
{
- int count = 0;
-
- count += fread(&Magic, sizeof(char), 4, stream);
+ stream->Read(Magic, 4);
Magic[4] = '\0'; // null-terminate it.
- count += fread(&Version, sizeof(uint32), 1, stream);
- count += fread(&LengthModelName, sizeof(uint32), 1, stream);
- count += fread(&OffsetName, sizeof(uint32), 1, stream);
- count += fread(&ModelFlags, sizeof(uint32), 1, stream);
- count += fread(&CountGlobalSequences, sizeof(uint32), 1, stream);
- count += fread(&OffsetGlobalSequences, sizeof(uint32), 1, stream);
- count += fread(&CountAnimations, sizeof(uint32), 1, stream);
- count += fread(&OffsetAnimations, sizeof(uint32), 1, stream);
- count += fread(&CountAnimationLookup, sizeof(uint32), 1, stream);
- count += fread(&OffsetAnimationLookup, sizeof(uint32), 1, stream);
- count += fread(&CountBones, sizeof(uint32), 1, stream);
- count += fread(&OffsetBones, sizeof(uint32), 1, stream);
- count += fread(&CountKeyBoneLookup, sizeof(uint32), 1, stream);
- count += fread(&OffsetKeyBoneLookup, sizeof(uint32), 1, stream);
- count += fread(&CountVertices, sizeof(uint32), 1, stream);
- count += fread(&OffsetVertices, sizeof(uint32), 1, stream);
- count += fread(&CountViews, sizeof(uint32), 1, stream);
- count += fread(&CountColors, sizeof(uint32), 1, stream);
- count += fread(&OffsetColors, sizeof(uint32), 1, stream);
- count += fread(&CountTextures, sizeof(uint32), 1, stream);
- count += fread(&OffsetTextures, sizeof(uint32), 1, stream);
- count += fread(&CountTransparency, sizeof(uint32), 1, stream);
- count += fread(&OffsetTransparency, sizeof(uint32), 1, stream);
- count += fread(&CountUvAnimation, sizeof(uint32), 1, stream);
- count += fread(&OffsetUvAnimation, sizeof(uint32), 1, stream);
- count += fread(&CountTexReplace, sizeof(uint32), 1, stream);
- count += fread(&OffsetTexReplace, sizeof(uint32), 1, stream);
- count += fread(&CountRenderFlags, sizeof(uint32), 1, stream);
- count += fread(&OffsetRenderFlags, sizeof(uint32), 1, stream);
- count += fread(&CountBoneLookup, sizeof(uint32), 1, stream);
- count += fread(&OffsetBoneLookup, sizeof(uint32), 1, stream);
- count += fread(&CountTexLookup, sizeof(uint32), 1, stream);
- count += fread(&OffsetTexLookup, sizeof(uint32), 1, stream);
- count += fread(&CountTexUnits, sizeof(uint32), 1, stream);
- count += fread(&OffsetTexUnits, sizeof(uint32), 1, stream);
- count += fread(&CountTransLookup, sizeof(uint32), 1, stream);
- count += fread(&OffsetTransLookup, sizeof(uint32), 1, stream);
- count += fread(&CountUvAnimLookup, sizeof(uint32), 1, stream);
- count += fread(&OffsetUvAnimLookup, sizeof(uint32), 1, stream);
+ Version = stream->Read<uint32>();
+ LengthModelName = stream->Read<uint32>();
+ OffsetName = stream->Read<uint32>();
+ ModelFlags = stream->Read<uint32>();
+ CountGlobalSequences = stream->Read<uint32>();
+ OffsetGlobalSequences = stream->Read<uint32>();
+ CountAnimations = stream->Read<uint32>();
+ OffsetAnimations = stream->Read<uint32>();
+ CountAnimationLookup = stream->Read<uint32>();
+ OffsetAnimationLookup = stream->Read<uint32>();
+ CountBones = stream->Read<uint32>();
+ OffsetBones = stream->Read<uint32>();
+ CountKeyBoneLookup = stream->Read<uint32>();
+ OffsetKeyBoneLookup = stream->Read<uint32>();
+ CountVertices = stream->Read<uint32>();
+ OffsetVertices = stream->Read<uint32>();
+ CountViews = stream->Read<uint32>();
+ CountColors = stream->Read<uint32>();
+ OffsetColors = stream->Read<uint32>();
+ CountTextures = stream->Read<uint32>();
+ OffsetTextures = stream->Read<uint32>();
+ CountTransparency = stream->Read<uint32>();
+ OffsetTransparency = stream->Read<uint32>();
+ CountUvAnimation = stream->Read<uint32>();
+ OffsetUvAnimation = stream->Read<uint32>();
+ CountTexReplace = stream->Read<uint32>();
+ OffsetTexReplace = stream->Read<uint32>();
+ CountRenderFlags = stream->Read<uint32>();
+ OffsetRenderFlags = stream->Read<uint32>();
+ CountBoneLookup = stream->Read<uint32>();
+ OffsetBoneLookup = stream->Read<uint32>();
+ CountTexLookup = stream->Read<uint32>();
+ OffsetTexLookup = stream->Read<uint32>();
+ CountTexUnits = stream->Read<uint32>();
+ OffsetTexUnits = stream->Read<uint32>();
+ CountTransLookup = stream->Read<uint32>();
+ OffsetTransLookup = stream->Read<uint32>();
+ CountUvAnimLookup = stream->Read<uint32>();
+ OffsetUvAnimLookup = stream->Read<uint32>();
VertexBox[0] = Vector3::Read(stream);
VertexBox[1] = Vector3::Read(stream);
- count += fread(&VertexRadius, sizeof(float), 1, stream);
+ VertexRadius = stream->Read<float>();
BoundingBox[0] = Vector3::Read(stream);
BoundingBox[1] = Vector3::Read(stream);
- count += fread(&BoundingRadius, sizeof(float), 1, stream);
- count += fread(&CountBoundingTriangles, sizeof(uint32), 1, stream);
- count += fread(&OffsetBoundingTriangles, sizeof(uint32), 1, stream);
- count += fread(&CountBoundingVertices, sizeof(uint32), 1, stream);
- count += fread(&OffsetBoundingVertices, sizeof(uint32), 1, stream);
- count += fread(&CountBoundingNormals, sizeof(uint32), 1, stream);
- count += fread(&OffsetBoundingNormals, sizeof(uint32), 1, stream);
-
- if (count != 51)
- printf("ModelHeader::Read: Failed to read some data expected 51, read %d\n", count);
-
+ BoundingRadius = stream->Read<float>();
+ CountBoundingTriangles = stream->Read<uint32>();
+ OffsetBoundingTriangles = stream->Read<uint32>();
+ CountBoundingVertices = stream->Read<uint32>();
+ OffsetBoundingVertices = stream->Read<uint32>();
+ CountBoundingNormals = stream->Read<uint32>();
+ OffsetBoundingNormals = stream->Read<uint32>();
}
-WorldModelHeader WorldModelHeader::Read(FILE* stream)
+WorldModelHeader WorldModelHeader::Read(Stream* stream)
{
WorldModelHeader ret;
int count = 0;
-
- count += fread(&ret.CountMaterials, sizeof(uint32), 1, stream);
- count += fread(&ret.CountGroups, sizeof(uint32), 1, stream);
- count += fread(&ret.CountPortals, sizeof(uint32), 1, stream);
- count += fread(&ret.CountLights, sizeof(uint32), 1, stream);
- count += fread(&ret.CountModels, sizeof(uint32), 1, stream);
- count += fread(&ret.CountDoodads, sizeof(uint32), 1, stream);
- count += fread(&ret.CountSets, sizeof(uint32), 1, stream);
- count += fread(&ret.AmbientColorUnk, sizeof(uint32), 1, stream);
- count += fread(&ret.WmoId, sizeof(uint32), 1, stream);
+ ret.CountMaterials = stream->Read<uint32>();
+ ret.CountGroups = stream->Read<uint32>();
+ ret.CountPortals = stream->Read<uint32>();
+ ret.CountLights = stream->Read<uint32>();
+ ret.CountModels = stream->Read<uint32>();
+ ret.CountDoodads = stream->Read<uint32>();
+ ret.CountSets = stream->Read<uint32>();
+ ret.AmbientColorUnk = stream->Read<uint32>();
+ ret.WmoId = stream->Read<uint32>();
ret.BoundingBox[0] = Vector3::Read(stream);
ret.BoundingBox[1] = Vector3::Read(stream);
- count += fread(&ret.LiquidTypeRelated, sizeof(uint32), 1, stream);
-
- if (count != 10)
- printf("WorldModelHeader::Read: Failed to read some data expected 10, read %d\n", count);
+ ret.LiquidTypeRelated = stream->Read<uint32>();
return ret;
}
-DoodadInstance DoodadInstance::Read(FILE* stream)
+DoodadInstance DoodadInstance::Read(Stream* stream)
{
DoodadInstance ret;
- int count = 0;
- count += fread(&ret.FileOffset, sizeof(uint32), 1, stream);
+ ret.FileOffset = stream->Read<uint32>();
ret.Position = Vector3::Read(stream);
- count += fread(&ret.QuatW, sizeof(float), 1, stream);
- count += fread(&ret.QuatX, sizeof(float), 1, stream);
- count += fread(&ret.QuatY, sizeof(float), 1, stream);
- count += fread(&ret.QuatZ, sizeof(float), 1, stream);
- count += fread(&ret.Scale, sizeof(float), 1, stream);
- count += fread(&ret.LightColor, sizeof(uint32), 1, stream);
-
- if (count != 7)
- printf("DoodadInstance::Read: Failed to read some data expected 7, read %d\n", count);
-
+ ret.QuatW = stream->Read<float>();
+ ret.QuatX = stream->Read<float>();
+ ret.QuatY = stream->Read<float>();
+ ret.QuatZ = stream->Read<float>();
+ ret.Scale = stream->Read<float>();
+ ret.LightColor = stream->Read<uint32>();
return ret;
}
-DoodadSet DoodadSet::Read(FILE* stream)
+DoodadSet DoodadSet::Read(Stream* stream)
{
DoodadSet ret;
- char name[21];
- int count = 0;
-
- count += fread(&name, sizeof(char), 20, stream);
- name[20] = '\0';
- ret.Name = name;
- count += fread(&ret.FirstInstanceIndex, sizeof(uint32), 1, stream);
- count += fread(&ret.CountInstances, sizeof(uint32), 1, stream);
- count += fread(&ret.UnknownZero, sizeof(uint32), 1, stream);
-
- if (count != 23)
- printf("DoodadSet::Read: Failed to read some data expected 23, read %d\n", count);
+ ret.Name = std::string(stream->Read(20), 20);
+ ret.FirstInstanceIndex = stream->Read<uint32>();
+ ret.CountInstances = stream->Read<uint32>();
+ ret.UnknownZero = stream->Read<uint32>();
+
return ret;
}
-LiquidHeader LiquidHeader::Read(FILE* stream)
+LiquidHeader LiquidHeader::Read(Stream* stream)
{
LiquidHeader ret;
- int count = 0;
- count += fread(&ret.CountXVertices, sizeof(uint32), 1, stream);
- count += fread(&ret.CountYVertices, sizeof(uint32), 1, stream);
- count += fread(&ret.Width, sizeof(uint32), 1, stream);
- count += fread(&ret.Height, sizeof(uint32), 1, stream);
+ ret.CountXVertices = stream->Read<uint32>();
+ ret.CountYVertices = stream->Read<uint32>();
+ ret.Width = stream->Read<uint32>();
+ ret.Height = stream->Read<uint32>();
ret.BaseLocation = Vector3::Read(stream);
- count += fread(&ret.MaterialId, sizeof(uint16), 1, stream);
-
- if (count != 5)
- printf("LiquidHeader::Read: Failed to read some data expected 5, read %d\n", count);
+ ret.MaterialId = stream->Read<uint16>();
return ret;
}
-LiquidData LiquidData::Read(FILE* stream, LiquidHeader& header)
+LiquidData LiquidData::Read(Stream* stream, LiquidHeader& header)
{
LiquidData ret;
ret.HeightMap = new float*[header.CountXVertices];
@@ -436,35 +370,22 @@ LiquidData LiquidData::Read(FILE* stream, LiquidHeader& header)
{
for (uint32 x = 0; x < header.CountXVertices; x++)
{
- uint32 discard;
- float tmp;
- if (fread(&discard, sizeof(uint32), 1, stream) == 1 &&
- fread(&tmp, sizeof(float), 1, stream) == 1)
- {
- ret.HeightMap[x][y] = tmp;
- }
+ stream->Read<uint32>(); // Dummy value
+ ret.HeightMap[x][y] = stream->Read<float>();
}
}
for (uint32 y = 0; y < header.Height; y++)
- {
for (uint32 x = 0; x < header.Width; x++)
- {
- uint8 tmp = 0;
- if (fread(&tmp, sizeof(uint8), 1, stream) == 1)
- ret.RenderFlags[x][y] = tmp;
- }
- }
+ ret.RenderFlags[x][y] = stream->Read<uint8>();
return ret;
}
-H2ORenderMask H2ORenderMask::Read(FILE* stream)
+H2ORenderMask H2ORenderMask::Read(Stream* stream)
{
H2ORenderMask ret;
- int32 count;
- if ((count = fread(&ret.Mask, sizeof(uint8), 8, stream)) != 8)
- printf("H2OHeader::Read: Failed to read some data expected 8, read %d\n", count);
+ stream->Read(ret.Mask, sizeof(uint8) * 8);
return ret;
}
@@ -480,38 +401,31 @@ bool MCNKLiquidData::IsWater(int x, int y, float height)
return false;
}
-H2OHeader H2OHeader::Read(FILE* stream)
+H2OHeader H2OHeader::Read(Stream* stream)
{
H2OHeader ret;
- int count = 0;
- count += fread(&ret.OffsetInformation, sizeof(uint32), 1, stream);
- count += fread(&ret.LayerCount, sizeof(uint32), 1, stream);
- count += fread(&ret.OffsetRender, sizeof(uint32), 1, stream);
-
- if (count != 3)
- printf("H2OHeader::Read: Failed to read some data expected 3, read %d\n", count);
-
+
+ ret.OffsetInformation = stream->Read<uint32>();
+ ret.LayerCount = stream->Read<uint32>();
+ ret.OffsetRender = stream->Read<uint32>();
+
return ret;
}
-H2OInformation H2OInformation::Read(FILE* stream)
+H2OInformation H2OInformation::Read(Stream* stream)
{
H2OInformation ret;
- int count = 0;
- count += fread(&ret.LiquidType, sizeof(uint16), 1, stream);
- count += fread(&ret.Flags, sizeof(uint16), 1, stream);
- count += fread(&ret.HeightLevel1, sizeof(float), 1, stream);
- count += fread(&ret.HeightLevel2, sizeof(float), 1, stream);
- count += fread(&ret.OffsetX, sizeof(uint8), 1, stream);
- count += fread(&ret.OffsetY, sizeof(uint8), 1, stream);
- count += fread(&ret.Width, sizeof(uint8), 1, stream);
- count += fread(&ret.Height, sizeof(uint8), 1, stream);
- count += fread(&ret.OffsetMask2, sizeof(uint32), 1, stream);
- count += fread(&ret.OffsetHeightmap, sizeof(uint32), 1, stream);
-
- if (count != 10)
- printf("H2OInformation::Read: Failed to read some data expected 10, read %d\n", count);
-
+ ret.LiquidType = stream->Read<uint16>();
+ ret.Flags = stream->Read<uint16>();
+ ret.HeightLevel1 = stream->Read<float>();
+ ret.HeightLevel2 = stream->Read<float>();
+ ret.OffsetX = stream->Read<uint8>();
+ ret.OffsetY = stream->Read<uint8>();
+ ret.Width = stream->Read<uint8>();
+ ret.Height = stream->Read<uint8>();
+ ret.OffsetMask2 = stream->Read<uint32>();
+ ret.OffsetHeightmap = stream->Read<uint32>();
+
return ret;
}
@@ -524,24 +438,20 @@ char* Utils::GetPlainName(const char* FileName)
return (char*)FileName;
}
-WMOGroupHeader WMOGroupHeader::Read( FILE* stream )
+WMOGroupHeader WMOGroupHeader::Read(Stream* stream)
{
WMOGroupHeader ret;
- int count = 0;
- count += fread(&ret.OffsetGroupName, sizeof(uint32), 1, stream);
- count += fread(&ret.OffsetDescriptiveName, sizeof(uint32), 1, stream);
- count += fread(&ret.Flags, sizeof(uint32), 1, stream);
+ ret.OffsetGroupName = stream->Read<uint32>();
+ ret.OffsetDescriptiveName = stream->Read<uint32>();
+ ret.Flags = stream->Read<uint32>();
ret.BoundingBox[0] = Vector3::Read(stream);
ret.BoundingBox[1] = Vector3::Read(stream);
- count += fread(&ret.OffsetPortals, sizeof(uint32), 1, stream);
- count += fread(&ret.CountPortals, sizeof(uint32), 1, stream);
- count += fread(&ret.CountBatches, sizeof(uint16), 4, stream);
- count += fread(&ret.Fogs, sizeof(uint8), 4, stream);
- count += fread(&ret.LiquidTypeRelated, sizeof(uint32), 1, stream);
- count += fread(&ret.WmoId, sizeof(uint32), 1, stream);
-
- if (count != 15)
- printf("WMOGroupHeader::Read: Failed to read some data expected 15, read %d\n", count);
-
+ ret.OffsetPortals = stream->Read<uint32>();
+ ret.CountPortals = stream->Read<uint32>();
+ stream->Read(ret.CountBatches, sizeof(uint16) * 4);
+ stream->Read(ret.Fogs, sizeof(uint8) * 4);
+ ret.LiquidTypeRelated = stream->Read<uint32>();
+ ret.WmoId = stream->Read<uint32>();
+
return ret;
}
diff --git a/src/tools/mesh_extractor/Utils.h b/src/tools/mesh_extractor/Utils.h
index 472cf6dbd1b..617da2b2244 100644
--- a/src/tools/mesh_extractor/Utils.h
+++ b/src/tools/mesh_extractor/Utils.h
@@ -10,6 +10,8 @@
#include "Define.h"
#include "Constants.h"
+#include "Stream.h"
+
#include <ace/Stack_Trace.h>
struct WorldModelDefinition;
@@ -42,7 +44,7 @@ struct Vector3
return Vector3(x * s, y * s, z * s);
}
- static Vector3 Read(FILE* file);
+ static Vector3 Read(Stream* file);
};
struct TilePos
@@ -93,7 +95,7 @@ public:
Vector3 Position;
uint32 OffsetMCCV;
- void Read(FILE* stream);
+ void Read(Stream* stream);
};
class MHDR
@@ -113,7 +115,7 @@ public:
uint32 OffsetMH2O;
uint32 OffsetMTFX;
- void Read(FILE* stream);
+ void Read(Stream* stream);
};
class ModelHeader
@@ -170,7 +172,7 @@ public:
uint32 CountBoundingNormals;
uint32 OffsetBoundingNormals;
- void Read(FILE* stream);
+ void Read(Stream* stream);
};
class WorldModelHeader
@@ -189,7 +191,7 @@ public:
Vector3 BoundingBox[2];
uint32 LiquidTypeRelated;
- static WorldModelHeader Read(FILE* stream);
+ static WorldModelHeader Read(Stream* stream);
};
class DoodadInstance
@@ -206,7 +208,7 @@ public:
float Scale;
uint32 LightColor;
- static DoodadInstance Read(FILE* stream);
+ static DoodadInstance Read(Stream* stream);
};
class DoodadSet
@@ -218,7 +220,7 @@ public:
uint32 CountInstances;
uint32 UnknownZero;
- static DoodadSet Read(FILE* stream);
+ static DoodadSet Read(Stream* stream);
};
class LiquidHeader
@@ -232,7 +234,7 @@ public:
Vector3 BaseLocation;
uint16 MaterialId;
- static LiquidHeader Read(FILE* stream);
+ static LiquidHeader Read(Stream* stream);
};
class LiquidData
@@ -247,7 +249,7 @@ public:
return RenderFlags[x][y] != 0x0F;
}
- static LiquidData Read(FILE* stream, LiquidHeader& header);
+ static LiquidData Read(Stream* stream, LiquidHeader& header);
};
class H2ORenderMask
@@ -261,7 +263,7 @@ public:
return (Mask[y] >> x & 1) != 0;
}
- static H2ORenderMask Read(FILE* stream);
+ static H2ORenderMask Read(Stream* stream);
};
class MCNKLiquidData
@@ -284,7 +286,7 @@ public:
uint32 LayerCount;
uint32 OffsetRender;
- static H2OHeader Read(FILE* stream);
+ static H2OHeader Read(Stream* stream);
};
class H2OInformation
@@ -302,7 +304,7 @@ public:
uint32 OffsetMask2;
uint32 OffsetHeightmap;
- static H2OInformation Read(FILE* stream);
+ static H2OInformation Read(Stream* stream);
};
class WMOGroupHeader
@@ -321,7 +323,7 @@ public:
uint32 LiquidTypeRelated;
uint32 WmoId;
- static WMOGroupHeader Read(FILE* stream);
+ static WMOGroupHeader Read(Stream* stream);
};
// Dummy class to act as an interface.
@@ -352,8 +354,6 @@ class Utils
{
public:
static void Reverse(char word[]);
- static std::string ReadString(FILE* file);
- static uint32 Size(FILE* file);
static Vector3 ToRecast(const Vector3& val );
static std::string GetAdtPath(const std::string& world, int x, int y);
static std::string FixModelPath(const std::string& path);
@@ -377,14 +377,14 @@ public:
return false;
return true;
}
- static std::string Replace( std::string str, const std::string& oldStr, const std::string& newStr );
- static void CreateDir( const std::string& Path );
- static void SaveToDisk(FILE* stream, const std::string& path);
- static Vector3 ToWoWCoords(const Vector3& vec );
- static std::string GetExtension( std::string path );
+ static std::string Replace(std::string str, const std::string& oldStr, const std::string& newStr);
+ static void CreateDir(const std::string& Path);
+ static void SaveToDisk(Stream* stream, const std::string& path);
+ static Vector3 ToWoWCoords(const Vector3& vec);
+ static std::string GetExtension( std::string path);
static char* GetPlainName(const char* FileName);
static Vector3 TransformDoodadVertex(const IDefinition& def, Vector3& vec, bool translate = true);
- static Vector3 VectorTransform(const Vector3& vec, const G3D::Matrix4& matrix, bool normal = false );
- static Vector3 TransformWmoDoodad(const DoodadInstance& inst, const WorldModelDefinition& root, Vector3& vec, bool translate = true );
+ static Vector3 VectorTransform(const Vector3& vec, const G3D::Matrix4& matrix, bool normal = false);
+ static Vector3 TransformWmoDoodad(const DoodadInstance& inst, const WorldModelDefinition& root, Vector3& vec, bool translate = true);
};
#endif
diff --git a/src/tools/mesh_extractor/WDT.cpp b/src/tools/mesh_extractor/WDT.cpp
index 2a5a18c9848..4a1d9c45b58 100644
--- a/src/tools/mesh_extractor/WDT.cpp
+++ b/src/tools/mesh_extractor/WDT.cpp
@@ -20,7 +20,7 @@ void WDT::ReadGlobalModel()
IsGlobalModel = true;
ModelDefinition = WorldModelDefinition::Read(defChunk->GetStream());
- ModelFile = Utils::ReadString(fileChunk->GetStream());
+ ModelFile = fileChunk->GetStream()->ReadString();
Model = new WorldModelRoot(ModelFile);
}
@@ -30,20 +30,14 @@ void WDT::ReadTileTable()
if (!chunk)
return;
IsValid = true;
- FILE* stream = chunk->GetStream();
+ Stream* stream = chunk->GetStream();
for (int y = 0; y < 64; ++y)
{
for (int x = 0; x < 64; ++x)
{
const uint32 hasTileFlag = 0x1;
- uint32 flags;
- uint32 discard;
- int count = 0;
- count += fread(&flags, sizeof(uint32), 1, stream);
- count += fread(&discard, sizeof(uint32), 1, stream);
-
- if (count != 2)
- printf("WDT::ReadTileTable: Failed to read some data expected 2, read %d\n", count);
+ uint32 flags = stream->Read<uint32>();
+ uint32 discard = stream->Read<uint32>();
if (flags & hasTileFlag)
TileTable.push_back(TilePos(x, y));
diff --git a/src/tools/mesh_extractor/WorldModelGroup.cpp b/src/tools/mesh_extractor/WorldModelGroup.cpp
index f76df73aaa6..08b315b9db3 100644
--- a/src/tools/mesh_extractor/WorldModelGroup.cpp
+++ b/src/tools/mesh_extractor/WorldModelGroup.cpp
@@ -3,10 +3,10 @@
#include "Chunk.h"
#include "Utils.h"
-WorldModelGroup::WorldModelGroup( std::string path, int groupIndex ) : GroupIndex(groupIndex), MOBA(NULL), IsBad(false), HasLiquidData(false)
+WorldModelGroup::WorldModelGroup(std::string path, int groupIndex) : GroupIndex(groupIndex), MOBA(NULL), IsBad(false), HasLiquidData(false)
{
Data = new ChunkedData(path);
- if (!Data->Stream)
+ if (!Data->_Stream)
{
IsBad = true;
return;
@@ -18,8 +18,8 @@ WorldModelGroup::WorldModelGroup( std::string path, int groupIndex ) : GroupInde
Name = Utils::GetPlainName(path.c_str());
- FILE* stream = mainChunk->GetStream();
- fseek(stream, firstSub, SEEK_SET);
+ Stream* stream = mainChunk->GetStream();
+ stream->Seek(firstSub, SEEK_SET);
SubData = new ChunkedData(stream, mainChunk->Length - firstSub);
ReadHeader();
@@ -40,7 +40,7 @@ void WorldModelGroup::ReadNormals()
uint32 normalCount = chunk->Length / 12;
ASSERT(normalCount == Vertices.size() && "normalCount is different than the Vertices count");
Normals.reserve(normalCount);
- FILE* stream = chunk->GetStream();
+ Stream* stream = chunk->GetStream();
for (uint32 i = 0; i < normalCount; i++)
Normals.push_back(Vector3::Read(stream));
}
@@ -52,7 +52,7 @@ void WorldModelGroup::ReadLiquid()
return;
HasLiquidData = true;
- FILE* stream = chunk->GetStream();
+ Stream* stream = chunk->GetStream();
LiquidDataHeader = LiquidHeader::Read(stream);
LiquidDataGeometry = LiquidData::Read(stream, LiquidDataHeader);
}
@@ -65,7 +65,7 @@ void WorldModelGroup::ReadVertices()
uint32 verticeCount = chunk->Length / 12;
Vertices.reserve(verticeCount);
- FILE* stream = chunk->GetStream();
+ Stream* stream = chunk->GetStream();
for (uint32 i = 0; i < verticeCount; i++)
Vertices.push_back(Vector3::Read(stream));
}
@@ -78,19 +78,13 @@ void WorldModelGroup::ReadTriangles()
uint32 triangleCount = chunk->Length / 6;
ASSERT(triangleCount == TriangleFlags.size() && "triangleCount != TriangleFlags.size()");
- FILE* stream = chunk->GetStream();
+ Stream* stream = chunk->GetStream();
Triangles.reserve(triangleCount);
for (uint32 i = 0; i < triangleCount; i++)
{
- uint16 v0;
- uint16 v1;
- uint16 v2;
- int count = 0;
- count += fread(&v0, sizeof(uint16), 1, stream);
- count += fread(&v1, sizeof(uint16), 1, stream);
- count += fread(&v2, sizeof(uint16), 1, stream);
- if (count != 3)
- printf("WorldModelGroup::ReadMaterials: Error reading data, expected 3, read %d\n", count);
+ uint16 v0 = stream->Read<uint16>();
+ uint16 v1 = stream->Read<uint16>();
+ uint16 v2 = stream->Read<uint16>();
Triangles.push_back(Triangle<uint16>(Constants::TRIANGLE_TYPE_WMO, v0, v1, v2));
}
@@ -102,20 +96,15 @@ void WorldModelGroup::ReadMaterials()
if (!chunk)
return;
- FILE* stream = chunk->GetStream();
+ Stream* stream = chunk->GetStream();
uint32 triangleCount = chunk->Length / 2;
TriangleFlags.reserve(triangleCount);
TriangleMaterials.reserve(triangleCount);
for (uint32 i = 0; i < triangleCount; i++)
{
- uint8 tmp;
- if (fread(&tmp, sizeof(uint8), 1, stream) != 1)
- printf("WorldModelGroup::ReadMaterials: Error reading data, expected 1, read 0\n");
- TriangleFlags.push_back(tmp);
+ TriangleFlags.push_back(stream->Read<uint8>());
// Read again for material.
- if (fread(&tmp, sizeof(uint8), 1, stream) != 1)
- printf("WorldModelGroup::ReadMaterials: Error reading data, expected 1, read 0\n");
- TriangleMaterials.push_back(tmp);
+ TriangleMaterials.push_back(stream->Read<uint8>());
}
}
@@ -125,7 +114,7 @@ void WorldModelGroup::ReadHeader()
if (!chunk)
return;
- FILE* stream = chunk->GetStream();
+ Stream* stream = chunk->GetStream();
Header = WMOGroupHeader::Read(stream);
}
@@ -137,7 +126,5 @@ void WorldModelGroup::ReadBatches()
MOBALength = chunk->Length / 2;
MOBA = new uint16[MOBALength];
- uint32 count = (uint32)fread(MOBA, sizeof(uint16), MOBALength, chunk->GetStream());
- if (count != MOBALength)
- printf("WorldModelGroup::ReadBatches: Error reading data, expected %u, read %u\n", MOBALength, count);
+ chunk->GetStream()->Read(MOBA, sizeof(uint16) * MOBALength);
}
diff --git a/src/tools/mesh_extractor/WorldModelHandler.cpp b/src/tools/mesh_extractor/WorldModelHandler.cpp
index 3565a1d6af0..d9f9cef2b96 100644
--- a/src/tools/mesh_extractor/WorldModelHandler.cpp
+++ b/src/tools/mesh_extractor/WorldModelHandler.cpp
@@ -4,27 +4,24 @@
#include "Cache.h"
#include "Model.h"
#include "Define.h"
+#include "Stream.h"
#include "G3D/Matrix4.h"
#include "G3D/Quat.h"
#include <cstdio>
-WorldModelDefinition WorldModelDefinition::Read( FILE* file )
+WorldModelDefinition WorldModelDefinition::Read(Stream* file)
{
WorldModelDefinition ret;
- int count = 0;
- count += fread(&ret.MwidIndex, sizeof(uint32), 1, file);
- count += fread(&ret.UniqueId, sizeof(uint32), 1, file);
+ ret.MwidIndex = file->Read<uint32>();
+ ret.UniqueId = file->Read<uint32>();
ret.Position = Vector3::Read(file);
ret.Rotation = Vector3::Read(file);
ret.UpperExtents = Vector3::Read(file);
ret.LowerExtents = Vector3::Read(file);
- count += fread(&ret.Flags, sizeof(uint16), 1, file);
- count += fread(&ret.DoodadSet, sizeof(uint16), 1, file);
- uint32 discard;
- count += fread(&discard, sizeof(uint32), 1, file);
-
- if (count != 5)
- printf("WorldModelDefinition::Read: Error reading data, expected 5, read %d\n", count);
+ ret.Flags = file->Read<uint16>();
+ ret.DoodadSet = file->Read<uint16>();
+ file->Read<uint32>(); // Discarded
+
return ret;
}
@@ -41,14 +38,12 @@ void WorldModelHandler::ProcessInternal( MapChunk* mcnk )
return;
uint32 refCount = mcnk->Header.MapObjectRefs;
- FILE* stream = mcnk->Source->GetStream();
- fseek(stream, mcnk->Source->Offset + mcnk->Header.OffsetMCRF, SEEK_SET);
+ Stream* stream = mcnk->Source->GetStream();
+ stream->Seek(mcnk->Source->Offset + mcnk->Header.OffsetMCRF, SEEK_SET);
// Start looping at the last Doodad Ref index
for (uint32 i = mcnk->Header.DoodadRefs; i < refCount; i++)
{
- int32 index;
- if (fread(&index, sizeof(int32), 1, stream) != 1)
- printf("WorldModelDefinition::Read: Error reading data, expected 1, read 0\n");
+ int32 index = stream->Read<int32>();
if (index < 0 || uint32(index) >= _definitions->size())
continue;
@@ -76,7 +71,7 @@ void WorldModelHandler::ProcessInternal( MapChunk* mcnk )
InsertModelGeometry(Vertices, Triangles, wmo, model);
}
// Restore the stream position
- fseek(stream, mcnk->Source->Offset, SEEK_SET);
+ stream->Seek(mcnk->Source->Offset, SEEK_SET);
}
void WorldModelHandler::InsertModelGeometry( std::vector<Vector3>& verts, std::vector<Triangle<uint32> >& tris, const WorldModelDefinition& def, WorldModelRoot* root, bool translate )
@@ -185,7 +180,7 @@ void WorldModelHandler::ReadDefinitions()
uint32 definitionCount = chunk->Length / definitionSize;
_definitions = new std::vector<WorldModelDefinition>;
_definitions->reserve(definitionCount);
- FILE* stream = chunk->GetStream();
+ Stream* stream = chunk->GetStream();
for (uint32 i = 0; i < definitionCount; i++)
_definitions->push_back(WorldModelDefinition::Read(stream));
}
@@ -202,14 +197,13 @@ void WorldModelHandler::ReadModelPaths()
_paths->reserve(paths);
for (uint32 i = 0; i < paths; i++)
{
- FILE* stream = mwid->GetStream();
- fseek(stream, i * 4, SEEK_CUR);
- uint32 offset;
- if (fread(&offset, sizeof(uint32), 1, stream) != 1)
- printf("WorldModelDefinition::Read: Error reading data, expected 1, read 0\n");
- FILE* dataStream = mwmo->GetStream();
- fseek(dataStream, offset + mwmo->Offset, SEEK_SET);
- _paths->push_back(Utils::ReadString(dataStream));
+ Stream* stream = mwid->GetStream();
+ stream->Seek(i * 4, SEEK_CUR);
+ uint32 offset = stream->Read<uint32>();
+
+ Stream* dataStream = mwmo->GetStream();
+ dataStream->Seek(offset + mwmo->Offset, SEEK_SET);
+ _paths->push_back(dataStream->ReadString());
}
}
diff --git a/src/tools/mesh_extractor/WorldModelHandler.h b/src/tools/mesh_extractor/WorldModelHandler.h
index 87a5ad62938..7924eb3f1a9 100644
--- a/src/tools/mesh_extractor/WorldModelHandler.h
+++ b/src/tools/mesh_extractor/WorldModelHandler.h
@@ -22,7 +22,7 @@ public:
uint16 Flags;
uint16 DoodadSet;
- static WorldModelDefinition Read(FILE* file);
+ static WorldModelDefinition Read(Stream* file);
};
class WorldModelHandler : public ObjectDataHandler
diff --git a/src/tools/mesh_extractor/WorldModelRoot.cpp b/src/tools/mesh_extractor/WorldModelRoot.cpp
index a00506f3b16..db909ad919c 100644
--- a/src/tools/mesh_extractor/WorldModelRoot.cpp
+++ b/src/tools/mesh_extractor/WorldModelRoot.cpp
@@ -37,7 +37,7 @@ void WorldModelRoot::ReadDoodadSets()
if (!chunk)
return;
- FILE* stream = chunk->GetStream();
+ Stream* stream = chunk->GetStream();
ASSERT(chunk->Length / 32 == Header.CountSets && "chunk.Length / 32 == Header.CountSets");
DoodadSets.reserve(Header.CountSets);
for (uint32 i = 0; i < Header.CountSets; i++)
@@ -56,14 +56,14 @@ void WorldModelRoot::ReadDoodadInstances()
DoodadInstances.reserve(countInstances);
for (uint32 i = 0; i < countInstances; i++)
{
- FILE* stream = chunk->GetStream();
- fseek(stream, instanceSize * i, SEEK_CUR);
+ Stream* stream = chunk->GetStream();
+ stream->Seek(instanceSize * i, SEEK_CUR);
DoodadInstance instance = DoodadInstance::Read(stream);
- FILE* nameStream = nameChunk->GetStream();
+ Stream* nameStream = nameChunk->GetStream();
if (instance.FileOffset >= nameChunk->Length)
continue;
- fseek(nameStream, instance.FileOffset, SEEK_CUR);
- instance.File = Utils::ReadString(nameStream);
+ nameStream->Seek(instance.FileOffset, SEEK_CUR);
+ instance.File = nameStream->ReadString();
DoodadInstances.push_back(instance);
}
}
@@ -74,6 +74,6 @@ void WorldModelRoot::ReadHeader()
if (!chunk)
return;
- FILE* stream = chunk->GetStream();
+ Stream* stream = chunk->GetStream();
Header = WorldModelHeader::Read(stream);
}