From 1d518a54914531d7a4fab3a6835b75de85bd7bc7 Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Wed, 9 Jul 2014 19:18:31 +0000 Subject: Initial support for multi-layered materials, requires shaders files in the new format. --- src/model/material.h | 199 ++++++++++++++++++++++++--------------------------- 1 file changed, 94 insertions(+), 105 deletions(-) (limited to 'src/model/material.h') diff --git a/src/model/material.h b/src/model/material.h index e2a1276..2e3a696 100644 --- a/src/model/material.h +++ b/src/model/material.h @@ -7,12 +7,12 @@ #ifndef __INCLUDED_MODEL_MATERIAL_H__ #define __INCLUDED_MODEL_MATERIAL_H__ +#include "model/layer.h" + #include +#include #include -#include "math/color.h" -#include "math/vector2f.h" - namespace model { @@ -20,17 +20,33 @@ namespace model 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 }; + /** + * @brief function pointer type the image loader hook + * */ + typedef void(* ImageLoaderFuncPtr)(Layer *); - /// 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 + /** + * @brief type definition for the material registry + * */ typedef std::map Registry; + + /** + * @brief type definition for the material layers list + * */ + typedef std::list Layers; + + /** + * @brief material surface flags + * */ + enum SurfaceFlags + { + FlagNone = 0, + FlagIgnore = 1, + FlagClip = 2, + FlagOrigin = 4, + FlagDecal = 8, + FlagBounds = 16 + }; Material(const std::string &name); @@ -40,61 +56,44 @@ public: /* ---- inspectors ----------------------------------------- */ - inline const std::string &name() const { + /** + * @brief returns the name of the material + * */ + 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 pixel size + * @brief returns the size of the material, in pixels */ - inline const math::Vector2f & size() const { + inline const math::Vector2f & size() const + { return material_size; } - + /** - * @brief returns true if the material has the requested flag set + * @brief return the flags for this material + * @see Flags * */ - inline bool has_flag(const SurfaceFlags surfaceflag) const { - return (((int) material_flags & surfaceflag) == surfaceflag); + inline const int flags() const + { + return material_flags; } - + /** - * @brief returns true if the material has the Texture flag set - * @see flags() + * @brief returns true if the material has the requested flag set * */ - inline bool has_flag_texture() const { - return (has_flag(FlagTexture)); + inline bool has_flag(const SurfaceFlags surfaceflag) const { + return ((material_flags & surfaceflag) == surfaceflag); } /** * @brief returns true if the material has the Clip flag set * @see flags() * */ - inline bool has_flag_clip() const { + inline bool has_flag_clip() const + { return (has_flag(FlagClip)); } @@ -102,7 +101,8 @@ public: * @brief returns true if the material has the Ignore flag set * @see flags() * */ - inline bool has_flag_ignore() const { + inline bool has_flag_ignore() const + { return (has_flag(FlagIgnore)); } @@ -110,54 +110,28 @@ public: * @brief returns true if the material has the Origin flag set * @see flags() * */ - inline bool has_flag_origin() const { + inline bool has_flag_origin() const + { return (has_flag(FlagOrigin)); } /** - * @brief returns true if the material has the Origin flag set + * @brief returns true if the material has the Bounds flag set * @see flags() * */ - inline bool has_flag_bounds() const { + 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) { + inline void set_flags(const SurfaceFlags flags) + { material_flags |= flags; } @@ -165,11 +139,32 @@ public: * @brief clear a specified surface flag * @see flags() * */ - inline void unset_flags(SurfaceFlags flags) { + inline void unset_flags(const SurfaceFlags flags) + { material_flags &= ~flags; } + + void set_size(const math::Vector2f & size); + + /** + * @brief layers in this material + * */ + inline const Layers & layers() const + { + return material_layers; + } + + inline Layers & layers() + { + return material_layers; + } /* ---- static ----------------------------------------------------- */ + + static inline Registry registry() + { + return material_registry; + } /** * @brief initialize material registry @@ -193,36 +188,30 @@ public: static void list(); /** - * @brief add a material to the registry + * @brief load a material into the registry + * If a material with the requested name already exists, it will be returned. + * If it doesnt, a mew material will be created, containing a single layer + * with a texture with the same name as the material. */ - static void add(Material *material); - + static Material *load(const std::string &name, const bool bright=false); + /** * @brief find a material in the registry */ static Material *find(const std::string &name); - static void set_loader_func(LoaderFuncPtr func); + static void set_imageloader_func(ImageLoaderFuncPtr 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; - + Layers material_layers; + std::string material_name; + int material_flags; + math::Vector2f material_size; + + static Registry material_registry; + static ImageLoaderFuncPtr material_imageloaderfunc; + static void load_shaderfile(const std::string &shadername); - - static LoaderFuncPtr material_loaderfunc; }; } -- cgit v1.2.3