Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/model/material.h')
-rw-r--r--src/model/material.h199
1 files changed, 94 insertions, 105 deletions
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 <string>
+#include <list>
#include <map>
-#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<std::string, Material *> Registry;
+
+ /**
+ * @brief type definition for the material layers list
+ * */
+ typedef std::list<Layer *> 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;
};
}