/* model/material.h This file is part of the Osirion project and is distributed under the terms of the GNU General Public License version 2 */ #ifndef __INCLUDED_MODEL_MATERIAL_H__ #define __INCLUDED_MODEL_MATERIAL_H__ #include #include #include "math/color.h" namespace model { /// fragment surface material parameters class Material { public: /// surface flags enum SurfaceFlags { None=0, Primary=1, Secondary=2, Tertiary=3, Bright=4, Engine=8, Environment=16, Texture=32}; /// type definition for the material registry typedef std::map Registry; Material(const std::string &name); ~Material(); /* ---- inspectors ----------------------------------------- */ inline const std::string &name() const { return material_name; } inline const math::Color &color() const { return material_color; } inline const unsigned int flags() const { return material_flags; } inline const std::string &texture() const { return material_texture; } inline const size_t texture_id() const { return material_texture_id; } /* ---- mutators ------------------------------------------- */ void set_color(const math::Color &color); void set_texture(const std::string &texture); void set_texture_id(const size_t texture_id); inline void set_flags(SurfaceFlags flags) { material_flags |= flags; } inline void unset_flags(SurfaceFlags flags) { material_flags &= ~flags; } /* ---- static ----------------------------------------------------- */ /** * @brief initialize material registry * reads materials from the shader files listed in shaderlist.txt */ static void init(); /** * @brief shutdown material registry */ static void shutdown(); /** * @brief clear material registry */ static void clear(); /** * @brief print registered materials to the system console */ static void list(); /** * @brief add a material to the registry */ static void add(Material *material); /** * @brief find a material in the registry */ static Material *find(const std::string &name); private: std::string material_name; math::Color material_color; unsigned int material_flags; std::string material_texture; size_t material_texture_id; /// the materials registry static Registry material_registry; static void load_shader(const std::string &shadername); }; } #endif // __INCLUDED_MODEL_MATERIAL_H__