91 lines
2.0 KiB
C++
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
|