nuclear@0: #ifndef TEXTURE_H_ nuclear@0: #define TEXTURE_H_ nuclear@0: nuclear@0: #include nuclear@0: #include "image.h" nuclear@0: nuclear@0: struct HitPoint; nuclear@0: nuclear@0: class Texture { nuclear@0: public: nuclear@0: enum class SampleMode { nearest, linear }; nuclear@0: enum class WrapMode { clamp, repeat }; nuclear@0: nuclear@0: protected: nuclear@0: std::string name; nuclear@0: nuclear@0: SampleMode sampling; nuclear@0: WrapMode wrapping; nuclear@0: nuclear@0: public: nuclear@0: Texture(); nuclear@0: virtual ~Texture(); nuclear@0: nuclear@0: virtual void set_name(const char *name); nuclear@0: virtual const char *get_name() const; nuclear@0: nuclear@0: virtual Image *get_image(int idx = 0) = 0; nuclear@0: virtual const Image *get_image(int idx = 0) const = 0; nuclear@0: nuclear@0: virtual void set_sampling_mode(SampleMode mode); nuclear@0: virtual SampleMode get_sampling_mode() const; nuclear@0: virtual void set_wrapping_mode(WrapMode mode); nuclear@0: virtual WrapMode get_wrapping_mode() const; nuclear@0: nuclear@0: virtual bool load(const char *fname) = 0; nuclear@0: nuclear@0: virtual Color sample(float u, float v, float w) const = 0; nuclear@0: virtual Color sample(const HitPoint &hit) const; nuclear@0: }; nuclear@0: nuclear@0: class Texture2D : public Texture { nuclear@0: private: nuclear@0: Image img; nuclear@0: nuclear@0: public: nuclear@0: virtual Image *get_image(int idx = 0); nuclear@0: virtual const Image *get_image(int idx = 0) const; nuclear@0: nuclear@0: virtual bool load(const char *fname); nuclear@0: nuclear@0: virtual Color sample(float u, float v, float w) const; nuclear@0: nuclear@0: friend Texture *load_texture(const char *fname); nuclear@0: }; nuclear@0: nuclear@0: class TextureCube : public Texture { nuclear@0: private: nuclear@0: Image img[6]; nuclear@0: nuclear@0: public: nuclear@0: TextureCube(); nuclear@0: nuclear@0: virtual Image *get_image(int idx = 0); nuclear@0: virtual const Image *get_image(int idx = 0) const; nuclear@0: nuclear@0: virtual bool load(const char *fname); nuclear@0: nuclear@0: virtual Color sample(float u, float v, float w) const; nuclear@0: virtual Color sample(const HitPoint &hit) const; nuclear@0: nuclear@0: friend Texture *load_texture(const char *fname); nuclear@0: }; nuclear@0: nuclear@0: Texture *load_texture(const char *fname); nuclear@0: nuclear@0: #endif // TEXTURE_H_