// // Copyright 2012-2015, Syoyo Fujita. // // Licensed under 2-clause BSD license. // //https://github.com/syoyo/tinyobjloader #ifndef _TINY_OBJ_LOADER_H #define _TINY_OBJ_LOADER_H #include #include #include namespace tinyobj { typedef struct { std::string name; float ambient[3]; float diffuse[3]; float specular[3]; float transmittance[3]; float emission[3]; float shininess; float ior; // index of refraction float dissolve; // 1 == opaque; 0 == fully transparent // illumination model (see http://www.fileformat.info/format/material/) int illum; std::string ambient_texname; std::string diffuse_texname; std::string specular_texname; std::string normal_texname; std::map unknown_parameter; } material_t; typedef struct { std::vector positions; std::vector normals; std::vector texcoords; std::vector indices; std::vector material_ids; // per-mesh material ID } mesh_t; typedef struct { std::string name; mesh_t mesh; } shape_t; class MaterialReader { public: MaterialReader() {} virtual ~MaterialReader() {} virtual std::string operator()(const std::string &matId, std::vector &materials, std::map &matMap) = 0; }; class MaterialFileReader : public MaterialReader { public: MaterialFileReader(const std::string &mtl_basepath) : m_mtlBasePath(mtl_basepath) {} virtual ~MaterialFileReader() {} virtual std::string operator()(const std::string &matId, std::vector &materials, std::map &matMap); private: std::string m_mtlBasePath; }; /// Loads .obj from a file. /// 'shapes' will be filled with parsed shape data /// The function returns error string. /// Returns empty string when loading .obj success. /// 'mtl_basepath' is optional, and used for base path for .mtl file. std::string LoadObj(std::vector &shapes, // [output] std::vector &materials, // [output] const char *filename, const char *mtl_basepath = NULL); /// Loads object from a std::istream, uses GetMtlIStreamFn to retrieve /// std::istream for materials. /// Returns empty string when loading .obj success. std::string LoadObj(std::vector &shapes, // [output] std::vector &materials, // [output] std::istream &inStream, MaterialReader &readMatFn); /// Loads materials into std::map /// Returns an empty string if successful std::string LoadMtl(std::map &material_map, std::vector &materials, std::istream &inStream); } #endif // _TINY_OBJ_LOADER_H