Files
wc3re/src/ObjDecoder.hh

87 lines
2.0 KiB
C++

#ifndef WC3RE_OBJDECODER_HH__
#define WC3RE_OBJDECODER_HH__
#include "IffFile.hh"
class ObjDecoder {
public:
ObjDecoder(std::string const& path);
ObjDecoder(IffFile::Handle iff);
using Vertex = std::array<int32_t, 3>;
using Vertices = std::vector<Vertex>;
using TexCoord = std::array<uint16_t, 2>;
struct Triangle {
uint16_t id;
uint16_t tex;
std::array<uint16_t, 3> vertIdx;
std::array<TexCoord, 3> texCoords;
};
using Triangles = std::vector<Triangle>;
struct Quad {
uint16_t id;
uint16_t tex;
std::array<uint16_t, 4> vertIdx;
std::array<TexCoord, 4> texCoords;
};
using Quads = std::vector<Quad>;
struct Texture {
std::string name;
uint16_t width, height;
std::vector<uint8_t> pixels;
};
using Textures = std::vector<Texture>;
struct TextureAnimation {
std::string name;
uint16_t width, height, frames;
std::vector<std::vector<uint8_t> > pixels;
};
using TextureAnimations = std::vector<TextureAnimation>;
Vertices const& getVertices() const {
return vertices_;
}
Triangles getTriangles(unsigned lvl = 0) const;
Quads getQuads(unsigned lvl = 0) const;
unsigned getDetailLevels() const {
return detailLevels_.size();
}
using DetailLevel = std::vector<uint16_t>;
using DetailLevels = std::vector<DetailLevel>;
Textures const& getTextures() const {
return textures_;
}
TextureAnimations const& getTextureAnimations() const {
return texAnims_;
}
private:
IffFile::Handle iff_;
std::string name_;
void parseOBJT_(IffFile::Form const& form);
void parseAPPR_(IffFile::Form const& form);
void parsePOLY_(IffFile::Form const& form);
void parseTRIS_(IffFile::Form const& form);
void parseQUAD_(IffFile::Form const& form);
void parseDETA_(IffFile::Form const& form);
void parseTXMS_(IffFile::Form const& form);
Vertices vertices_;
Triangles triangles_;
Quads quads_;
Textures textures_;
TextureAnimations texAnims_;
DetailLevels detailLevels_;
};
#endif