forked from TcT2k/HLMWadExplorer
-
Notifications
You must be signed in to change notification settings - Fork 0
/
TexturePack.cpp
118 lines (98 loc) · 2.16 KB
/
TexturePack.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/*
** HLMWadExplorer
**
** Copyright (C) 2015 Tobias Taschner <github@tc84.de>
**
** Licensed under GPL v3 or later
*/
#include "TexturePack.h"
//
// TexturePack
//
TexturePack::TexturePack(wxInputStream& iStr)
{
Parse(iStr);
}
void TexturePack::Parse(wxInputStream& iStr)
{
clear();
// Check header
wxUint8 idLen;
iStr.Read(&idLen, sizeof(idLen));
char id[16];
id[15] = 0;
iStr.Read(&id, 15);
if (idLen != 0xF || wxStrcmp(id, "AGTEXTUREPACKER") != 0)
{
wxLogWarning("Invalid texture file format");
return;
}
iStr.Read(&m_version, sizeof(m_version));
if (m_version >= 2)
{
// Skip slice count
iStr.SeekI(4, wxFromCurrent);
} else {
iStr.Read(&m_width, sizeof(m_width));
iStr.Read(&m_height, sizeof(m_height));
}
// Read textures until file ends
while (!iStr.Eof())
{
Texture tex(this, iStr);
if (!iStr.Eof())
push_back(tex);
}
}
//
// Texture
//
Texture::Texture(TexturePack* pack, wxInputStream& iStr):
m_pack(pack)
{
Parse(iStr);
}
void Texture::Parse(wxInputStream& iStr)
{
wxUint8 nameLen;
iStr.Read(&nameLen, sizeof(nameLen));
if (iStr.Eof())
return;
wxCharBuffer nameBuf(nameLen);
iStr.Read(nameBuf.data(), nameLen);
m_name = nameBuf;
wxUint32 frameCount;
iStr.Read(&frameCount, sizeof(frameCount));
reserve(frameCount);
for (wxUint32 frameIndex = 0; frameIndex < frameCount; frameIndex++)
{
// skip atlas index
if (m_pack->GetVersion() >= 2)
iStr.SeekI(4, wxFromCurrent);
push_back(Frame(iStr));
}
}
//
// Frame
//
Frame::Frame(wxInputStream& iStr)
{
Parse(iStr);
}
void Frame::Parse(wxInputStream& iStr)
{
wxUint32 frameWidth;
wxUint32 frameHeight;
iStr.Read(&frameWidth, sizeof(frameWidth));
iStr.Read(&frameHeight, sizeof(frameHeight));
m_size = wxSize(frameWidth, frameHeight);
wxUint32 offsetX;
wxUint32 offsetY;
iStr.Read(&offsetX, sizeof(offsetX));
iStr.Read(&offsetY, sizeof(offsetY));
m_offset = wxPoint(offsetX, offsetY);
iStr.Read(&m_uStart, sizeof(m_uStart));
iStr.Read(&m_vStart, sizeof(m_vStart));
iStr.Read(&m_uEnd, sizeof(m_uEnd));
iStr.Read(&m_vEnd, sizeof(m_vEnd));
}