#ifndef WC3RE_OBJDECODER_HH__ #define WC3RE_OBJDECODER_HH__ #include #include #include #include #include "IffFile.hh" class Resource; class ObjDecoder { public: ObjDecoder(Resource const& res); using Vertex = std::array; using Vertices = std::vector; using TexCoord = std::array; struct Triangle { uint16_t id; uint16_t tex; std::array vertIdx; std::array texCoords; }; using Triangles = std::vector; struct Quad { uint16_t id; uint16_t tex; std::array vertIdx; std::array texCoords; }; using Quads = std::vector; struct Texture { std::string name; uint16_t width, height; std::vector pixels; }; using Textures = std::vector; struct TextureAnimation { std::string name; uint16_t width, height, frames; std::vector > pixels; }; using TextureAnimations = std::vector; 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; using DetailLevels = std::vector; 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