/** * PANDA 3D SOFTWARE * Copyright (c) Carnegie Mellon University. All rights reserved. * * All use of this software is subject to the terms of the revised BSD * license. You should have received a copy of this license along * with this source code in a file named "LICENSE." * * @file eggTexture.h * @author drose * @date 1999-01-18 */ #ifndef EGGTEXTURE_H #define EGGTEXTURE_H #include "pandabase.h" #include "eggRenderMode.h" #include "eggFilenameNode.h" #include "eggTransform.h" #include "pset.h" #include "luse.h" /** * Defines a texture map that may be applied to geometry. */ class EXPCL_PANDA_EGG EggTexture : public EggFilenameNode, public EggRenderMode, public EggTransform { PUBLISHED: explicit EggTexture(const std::string &tref_name, const Filename &filename); EggTexture(const EggTexture ©); EggTexture &operator = (const EggTexture ©); virtual ~EggTexture(); virtual void write(std::ostream &out, int indent_level) const; enum Equivalence { E_basename = 0x001, E_extension = 0x002, E_dirname = 0x004, E_complete_filename = 0x007, E_transform = 0x008, E_attributes = 0x010, E_tref_name = 0x020, }; bool is_equivalent_to(const EggTexture &other, int eq) const; bool sorts_less_than(const EggTexture &other, int eq) const; bool has_alpha_channel(int num_components) const; enum TextureType { TT_unspecified, TT_1d_texture, TT_2d_texture, TT_3d_texture, TT_cube_map }; enum Format { F_unspecified, F_rgba, F_rgbm, F_rgba12, F_rgba8, F_rgba4, F_rgba5, F_rgb, F_rgb12, F_rgb8, F_rgb5, F_rgb332, F_red, F_green, F_blue, F_alpha, F_luminance, F_luminance_alpha, F_luminance_alphamask }; enum CompressionMode { CM_default, CM_off, CM_on, CM_fxt1, CM_dxt1, CM_dxt2, CM_dxt3, CM_dxt4, CM_dxt5, }; enum WrapMode { WM_unspecified, WM_clamp, WM_repeat, WM_mirror, WM_mirror_once, WM_border_color }; enum FilterType { // Note that these type values match up, name-for-name, with a similar // enumerated type in Panda's Texture object. However, they do *not* // match up numerically. You must convert between them using a switch // statement. FT_unspecified, // Mag Filter and Min Filter FT_nearest, FT_linear, // Min Filter Only FT_nearest_mipmap_nearest, // "mipmap point" FT_linear_mipmap_nearest, // "mipmap linear" FT_nearest_mipmap_linear, // "mipmap bilinear" FT_linear_mipmap_linear, // "mipmap trilinear" }; enum EnvType { ET_unspecified, ET_modulate, ET_decal, ET_blend, ET_replace, ET_add, ET_blend_color_scale, ET_modulate_glow, ET_modulate_gloss, ET_normal, ET_normal_height, ET_glow, ET_gloss, ET_height, ET_selector, ET_normal_gloss, }; enum CombineMode { CM_unspecified, CM_replace, CM_modulate, CM_add, CM_add_signed, CM_interpolate, CM_subtract, CM_dot3_rgb, CM_dot3_rgba, }; enum CombineChannel { CC_rgb = 0, CC_alpha = 1, CC_num_channels = 2, }; enum CombineIndex { CI_num_indices = 3 }; enum CombineSource { CS_unspecified, CS_texture, CS_constant, CS_primary_color, CS_previous, CS_constant_color_scale, CS_last_saved_result, }; enum CombineOperand { CO_unspecified, CO_src_color, CO_one_minus_src_color, CO_src_alpha, CO_one_minus_src_alpha, }; enum TexGen { TG_unspecified, TG_eye_sphere_map, TG_world_cube_map, TG_eye_cube_map, TG_world_normal, TG_eye_normal, TG_world_position, TG_eye_position, TG_point_sprite, }; enum QualityLevel { QL_unspecified, QL_default, QL_fastest, QL_normal, QL_best, }; INLINE void set_texture_type(TextureType texture_type); INLINE TextureType get_texture_type() const; INLINE void set_format(Format format); INLINE Format get_format() const; INLINE void set_compression_mode(CompressionMode mode); INLINE CompressionMode get_compression_mode() const; INLINE void set_wrap_mode(WrapMode mode); INLINE WrapMode get_wrap_mode() const; INLINE void set_wrap_u(WrapMode mode); INLINE WrapMode get_wrap_u() const; INLINE WrapMode determine_wrap_u() const; INLINE void set_wrap_v(WrapMode mode); INLINE WrapMode get_wrap_v() const; INLINE WrapMode determine_wrap_v() const; INLINE void set_wrap_w(WrapMode mode); INLINE WrapMode get_wrap_w() const; INLINE WrapMode determine_wrap_w() const; INLINE void set_minfilter(FilterType type); INLINE FilterType get_minfilter() const; INLINE void set_magfilter(FilterType type); INLINE FilterType get_magfilter() const; INLINE void set_anisotropic_degree(int anisotropic_degree); INLINE void clear_anisotropic_degree(); INLINE bool has_anisotropic_degree() const; INLINE int get_anisotropic_degree() const; INLINE void set_env_type(EnvType type); INLINE EnvType get_env_type() const; bool affects_polygon_alpha() const; INLINE void set_combine_mode(CombineChannel channel, CombineMode cm); INLINE CombineMode get_combine_mode(CombineChannel channel) const; INLINE void set_combine_source(CombineChannel channel, int n, CombineSource cs); INLINE CombineSource get_combine_source(CombineChannel channel, int n) const; INLINE void set_combine_operand(CombineChannel channel, int n, CombineOperand co); INLINE CombineOperand get_combine_operand(CombineChannel channel, int n) const; INLINE void set_saved_result(bool saved_result); INLINE bool get_saved_result() const; INLINE void set_tex_gen(TexGen tex_gen); INLINE TexGen get_tex_gen() const; INLINE void set_quality_level(QualityLevel quality_level); INLINE QualityLevel get_quality_level() const; INLINE void set_stage_name(const std::string &stage_name); INLINE void clear_stage_name(); INLINE bool has_stage_name() const; INLINE const std::string &get_stage_name() const; INLINE void set_priority(int priority); INLINE void clear_priority(); INLINE bool has_priority() const; INLINE int get_priority() const; INLINE void set_color(const LColor &color); INLINE void clear_color(); INLINE bool has_color() const; INLINE const LColor &get_color() const; INLINE void set_border_color(const LColor &border_color); INLINE void clear_border_color(); INLINE bool has_border_color() const; INLINE const LColor &get_border_color() const; INLINE void set_uv_name(const std::string &uv_name); INLINE void clear_uv_name(); INLINE bool has_uv_name() const; INLINE const std::string &get_uv_name() const; INLINE void set_rgb_scale(int rgb_scale); INLINE void clear_rgb_scale(); INLINE bool has_rgb_scale() const; INLINE int get_rgb_scale() const; INLINE void set_alpha_scale(int alpha_scale); INLINE void clear_alpha_scale(); INLINE bool has_alpha_scale() const; INLINE int get_alpha_scale() const; INLINE void set_alpha_filename(const Filename &filename); INLINE void clear_alpha_filename(); INLINE bool has_alpha_filename() const; INLINE const Filename &get_alpha_filename() const; INLINE void set_alpha_fullpath(const Filename &fullpath); INLINE const Filename &get_alpha_fullpath() const; INLINE void set_alpha_file_channel(int alpha_file_channel); INLINE void clear_alpha_file_channel(); INLINE bool has_alpha_file_channel() const; INLINE int get_alpha_file_channel() const; INLINE void set_multiview(bool multiview); INLINE bool get_multiview() const; INLINE void set_num_views(int num_views); INLINE void clear_num_views(); INLINE bool has_num_views() const; INLINE int get_num_views() const; INLINE void set_read_mipmaps(bool read_mipmaps); INLINE bool get_read_mipmaps() const; INLINE void set_min_lod(double min_lod); INLINE void clear_min_lod(); INLINE bool has_min_lod() const; INLINE double get_min_lod() const; INLINE void set_max_lod(double max_lod); INLINE void clear_max_lod(); INLINE bool has_max_lod() const; INLINE double get_max_lod() const; INLINE void set_lod_bias(double lod_bias); INLINE void clear_lod_bias(); INLINE bool has_lod_bias() const; INLINE double get_lod_bias() const; void clear_multitexture(); bool multitexture_over(EggTexture *other); INLINE int get_multitexture_sort() const; static TextureType string_texture_type(const std::string &string); static Format string_format(const std::string &string); static CompressionMode string_compression_mode(const std::string &string); static WrapMode string_wrap_mode(const std::string &string); static FilterType string_filter_type(const std::string &string); static EnvType string_env_type(const std::string &string); static CombineMode string_combine_mode(const std::string &string); static CombineSource string_combine_source(const std::string &string); static CombineOperand string_combine_operand(const std::string &string); static TexGen string_tex_gen(const std::string &string); static QualityLevel string_quality_level(const std::string &string); PUBLISHED: MAKE_PROPERTY(texture_type, get_texture_type, set_texture_type); MAKE_PROPERTY(format, get_format, set_format); MAKE_PROPERTY(compression_mode, get_compression_mode, set_compression_mode); MAKE_PROPERTY(wrap_mode, get_wrap_mode, set_wrap_mode); MAKE_PROPERTY(wrap_u, get_wrap_u, set_wrap_u); MAKE_PROPERTY(wrap_v, get_wrap_v, set_wrap_v); MAKE_PROPERTY(wrap_w, get_wrap_w, set_wrap_w); MAKE_PROPERTY(minfilter, get_minfilter, set_minfilter); MAKE_PROPERTY(magfilter, get_magfilter, set_magfilter); MAKE_PROPERTY2(anisotropic_degree, has_anisotropic_degree, get_anisotropic_degree, set_anisotropic_degree, clear_anisotropic_degree); MAKE_PROPERTY(env_type, get_env_type, set_env_type); MAKE_PROPERTY(saved_result, get_saved_result, set_saved_result); MAKE_PROPERTY(tex_gen, get_tex_gen, set_tex_gen); MAKE_PROPERTY(quality_level, get_quality_level, set_quality_level); MAKE_PROPERTY2(stage_name, has_stage_name, get_stage_name, set_stage_name, clear_stage_name); MAKE_PROPERTY2(priority, has_priority, get_priority, set_priority, clear_priority); MAKE_PROPERTY2(color, has_color, get_color, set_color, clear_color); MAKE_PROPERTY2(border_color, has_border_color, get_border_color, set_border_color, clear_border_color); MAKE_PROPERTY2(uv_name, has_uv_name, get_uv_name, set_uv_name, clear_uv_name); MAKE_PROPERTY2(rgb_scale, has_rgb_scale, get_rgb_scale, set_rgb_scale, clear_rgb_scale); MAKE_PROPERTY2(alpha_scale, has_alpha_scale, get_alpha_scale, set_alpha_scale, clear_alpha_scale); MAKE_PROPERTY2(alpha_filename, has_alpha_filename, get_alpha_filename, set_alpha_filename, clear_alpha_filename); MAKE_PROPERTY(alpha_fullpath, get_alpha_fullpath, set_alpha_fullpath); MAKE_PROPERTY2(alpha_file_channel, has_alpha_file_channel, get_alpha_file_channel, set_alpha_file_channel, clear_alpha_file_channel); MAKE_PROPERTY(multiview, get_multiview, set_multiview); MAKE_PROPERTY2(num_views, has_num_views, get_num_views, set_num_views, clear_num_views); MAKE_PROPERTY(read_mipmaps, get_read_mipmaps, set_read_mipmaps); MAKE_PROPERTY2(min_lod, has_min_lod, get_min_lod, set_min_lod, clear_min_lod); MAKE_PROPERTY2(max_lod, has_max_lod, get_max_lod, set_max_lod, clear_max_lod); MAKE_PROPERTY2(lod_bias, has_lod_bias, get_lod_bias, set_lod_bias, clear_lod_bias); MAKE_PROPERTY(multitexture_sort, get_multitexture_sort); public: virtual EggTransform *as_transform(); protected: virtual bool egg_start_parse_body(); private: typedef pset MultiTextures; bool r_min_multitexture_sort(int sort, MultiTextures &cycle_detector); enum Flags { F_has_alpha_filename = 0x0002, F_has_anisotropic_degree = 0x0004, F_has_alpha_file_channel = 0x0008, F_has_stage_name = 0x0010, F_has_uv_name = 0x0020, F_has_priority = 0x0040, F_has_color = 0x0080, F_has_rgb_scale = 0x0100, F_has_alpha_scale = 0x0200, F_has_border_color = 0x0400, F_has_num_views = 0x0800, F_has_min_lod = 0x1000, F_has_max_lod = 0x2000, F_has_lod_bias = 0x4000, }; TextureType _texture_type; Format _format; CompressionMode _compression_mode; WrapMode _wrap_mode, _wrap_u, _wrap_v, _wrap_w; FilterType _minfilter, _magfilter; int _anisotropic_degree; EnvType _env_type; bool _saved_result; bool _multiview; int _num_views; TexGen _tex_gen; QualityLevel _quality_level; std::string _stage_name; int _priority; LColor _color; LColor _border_color; std::string _uv_name; int _rgb_scale; int _alpha_scale; int _flags; Filename _alpha_filename; Filename _alpha_fullpath; int _alpha_file_channel; bool _read_mipmaps; int _multitexture_sort; double _min_lod; double _max_lod; double _lod_bias; class SourceAndOperand { public: INLINE SourceAndOperand(); CombineSource _source; CombineOperand _operand; }; class Combiner { public: INLINE Combiner(); CombineMode _mode; SourceAndOperand _ops[CI_num_indices]; }; Combiner _combiner[CC_num_channels]; // This is the set of all of the textures that are multitextured on top of // (and under) this one. This is filled in by multitexture_over(). MultiTextures _over_textures, _under_textures; public: static TypeHandle get_class_type() { return _type_handle; } static void init_type() { EggFilenameNode::init_type(); EggRenderMode::init_type(); register_type(_type_handle, "EggTexture", EggFilenameNode::get_class_type(), EggRenderMode::get_class_type()); } virtual TypeHandle get_type() const { return get_class_type(); } virtual TypeHandle force_init_type() {init_type(); return get_class_type();} private: static TypeHandle _type_handle; }; /** * An STL function object for sorting textures into order by properties. * Returns true if the two referenced EggTexture pointers are in sorted order, * false otherwise. */ class EXPCL_PANDA_EGG UniqueEggTextures { public: INLINE UniqueEggTextures(int eq = ~0); INLINE bool operator ()(const EggTexture *t1, const EggTexture *t2) const; int _eq; }; INLINE std::ostream &operator << (std::ostream &out, const EggTexture &n) { return out << n.get_filename(); } EXPCL_PANDA_EGG std::ostream &operator << (std::ostream &out, EggTexture::TextureType texture_type); EXPCL_PANDA_EGG std::ostream &operator << (std::ostream &out, EggTexture::Format format); EXPCL_PANDA_EGG std::ostream &operator << (std::ostream &out, EggTexture::CompressionMode mode); EXPCL_PANDA_EGG std::ostream &operator << (std::ostream &out, EggTexture::WrapMode mode); EXPCL_PANDA_EGG std::ostream &operator << (std::ostream &out, EggTexture::FilterType type); EXPCL_PANDA_EGG std::ostream &operator << (std::ostream &out, EggTexture::EnvType type); EXPCL_PANDA_EGG std::ostream &operator << (std::ostream &out, EggTexture::CombineMode cm); EXPCL_PANDA_EGG std::ostream &operator << (std::ostream &out, EggTexture::CombineChannel cc); EXPCL_PANDA_EGG std::ostream &operator << (std::ostream &out, EggTexture::CombineSource cs); EXPCL_PANDA_EGG std::ostream &operator << (std::ostream &out, EggTexture::CombineOperand co); EXPCL_PANDA_EGG std::ostream &operator << (std::ostream &out, EggTexture::TexGen tex_gen); EXPCL_PANDA_EGG std::ostream &operator << (std::ostream &out, EggTexture::QualityLevel quality_level); #include "eggTexture.I" #endif