/* 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, Clip = 128, Origin = 256, Decal = 512 }; /// type definition for the material registry typedef std::map Registry; Material(const std::string &name); ~Material(); void print(); /* ---- inspectors ----------------------------------------- */ inline const std::string &name() const { return material_name; } inline const math::Color &color() const { return material_color; } inline const math::Color &specular() const { return material_specular; } 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; } /** * @brief returns true if the material has the requested flag set * */ inline bool flag_is_set(const SurfaceFlags surfaceflag) const { return (((int) material_flags & surfaceflag) == surfaceflag); } /** * @brief returns true if the material has the Ignore flag set * @see flags() * */ inline bool ignore_is_set() const { return (flag_is_set(Ignore)); } /** * @brief returns true if the material has the Origin flag set * @see flags() * */ inline bool origin_is_set() const { return (flag_is_set(Origin)); } /* ---- mutators ------------------------------------------- */ void set_color(const math::Color &color); void set_specular(const math::Color &specular); /** * @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; math::Color material_specular; 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__