Files
wc3re/ObjDecoder.hh

91 lines
2.0 KiB
C++

#ifndef WC3RE_OBJDECODER_HH__
#define WC3RE_OBJDECODER_HH__
#include <string>
#include <cstdint>
#include <vector>
#include <array>
#include "IffFile.hh"
class ObjDecoder {
public:
ObjDecoder(uint8_t const* base, size_t length);
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 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