/* 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 *); /// color types enum ColorType {ColorMaterial = 0, ColorPrimary = 1, ColorSecondary = 2, ColorTertiary = 3, ColorEngine = 4 }; /// surface flags enum SurfaceFlags { FlagNone = 0, FlagBright = 1,FlagEnvironment = 2, FlagTexture = 4, FlagIgnore = 8, FlagClip = 16, FlagOrigin = 32, FlagDecal = 64, FlagBounds = 128 }; /// 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 ColorType colortype() const { return material_colortype; } 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 has_flag(const SurfaceFlags surfaceflag) const { return (((int) material_flags & surfaceflag) == surfaceflag); } /** * @brief returns true if the material has the Texture flag set * @see flags() * */ inline bool has_flag_texture() const { return (has_flag(FlagTexture)); } /** * @brief returns true if the material has the Clip flag set * @see flags() * */ inline bool has_flag_clip() const { return (has_flag(FlagClip)); } /** * @brief returns true if the material has the Ignore flag set * @see flags() * */ inline bool has_flag_ignore() const { return (has_flag(FlagIgnore)); } /** * @brief returns true if the material has the Origin flag set * @see flags() * */ inline bool has_flag_origin() const { return (has_flag(FlagOrigin)); } /** * @brief returns true if the material has the Origin flag set * @see flags() * */ inline bool has_flag_bounds() const { return (has_flag(FlagBounds)); } /* ---- 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); /** * @brief set the color type * */ void set_colortype(ColorType colortype); /** * @brief set a specified surface flag * @see flags() * */ inline void set_flags(SurfaceFlags flags) { material_flags |= flags; } /** * @brief clear a specified surface flag * @see 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; ColorType material_colortype; 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__