/* 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" #include "math/vector2f.h" namespace model { /// fragment surface material parameters class Material { public: /// function pointer type for local functions typedef void(* LoaderFuncPtr)(Material *); /// surface flags enum SurfaceFlags { None=0, Primary=1, Secondary=2, Tertiary=3, Bright=4, Engine=8, Environment=16, Texture=32, Ignore=64}; /// 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; } /** * @brief returns the material texture size */ inline const math::Vector2f & size() const { return material_size; } /* ---- mutators ------------------------------------------- */ void set_color(const math::Color &color); /** * @brief set the material texture name */ void set_texture(const std::string &texture); /** * @brief set the material texture id */ void set_texture_id(const size_t texture_id); /** * @brief set the material texture size */ void set_size(const float width, const float height); /** * @brief set the material texture size */ void set_size(const math::Vector2f &size); 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); static void set_loader_func(LoaderFuncPtr func); private: std::string material_name; math::Color material_color; unsigned int material_flags; std::string material_texture; size_t material_texture_id; /// size of the material math::Vector2f material_size; /// the materials registry static Registry material_registry; static void load_shader(const std::string &shadername); static LoaderFuncPtr material_loaderfunc; }; } #endif // __INCLUDED_MODEL_MATERIAL_H__