Panda3D
eggTexture.h
Go to the documentation of this file.
1 /**
2  * PANDA 3D SOFTWARE
3  * Copyright (c) Carnegie Mellon University. All rights reserved.
4  *
5  * All use of this software is subject to the terms of the revised BSD
6  * license. You should have received a copy of this license along
7  * with this source code in a file named "LICENSE."
8  *
9  * @file eggTexture.h
10  * @author drose
11  * @date 1999-01-18
12  */
13 
14 #ifndef EGGTEXTURE_H
15 #define EGGTEXTURE_H
16 
17 #include "pandabase.h"
18 
19 #include "eggRenderMode.h"
20 #include "eggFilenameNode.h"
21 #include "eggTransform.h"
22 
23 #include "pset.h"
24 #include "luse.h"
25 
26 
27 /**
28  * Defines a texture map that may be applied to geometry.
29  */
30 class EXPCL_PANDA_EGG EggTexture : public EggFilenameNode, public EggRenderMode, public EggTransform {
31 PUBLISHED:
32  explicit EggTexture(const std::string &tref_name, const Filename &filename);
33  EggTexture(const EggTexture &copy);
34  EggTexture &operator = (const EggTexture &copy);
35  virtual ~EggTexture();
36 
37  virtual void write(std::ostream &out, int indent_level) const;
38 
39  enum Equivalence {
40  E_basename = 0x001,
41  E_extension = 0x002,
42  E_dirname = 0x004,
43  E_complete_filename = 0x007,
44  E_transform = 0x008,
45  E_attributes = 0x010,
46  E_tref_name = 0x020,
47  };
48 
49  bool is_equivalent_to(const EggTexture &other, int eq) const;
50  bool sorts_less_than(const EggTexture &other, int eq) const;
51 
52  bool has_alpha_channel(int num_components) const;
53 
54  enum TextureType {
55  TT_unspecified, TT_1d_texture,
56  TT_2d_texture, TT_3d_texture, TT_cube_map
57  };
58  enum Format {
59  F_unspecified,
60  F_rgba, F_rgbm, F_rgba12, F_rgba8, F_rgba4, F_rgba5,
61  F_rgb, F_rgb12, F_rgb8, F_rgb5, F_rgb332,
62  F_red, F_green, F_blue, F_alpha, F_luminance,
63  F_luminance_alpha, F_luminance_alphamask,
64 
65  // Only for compatibility with .bam, use is discouraged!
66  F_srgb, F_srgb_alpha
67  };
68  enum CompressionMode {
69  CM_default, CM_off, CM_on,
70  CM_fxt1, CM_dxt1, CM_dxt2, CM_dxt3, CM_dxt4, CM_dxt5,
71  };
72  enum WrapMode {
73  WM_unspecified, WM_clamp, WM_repeat,
74  WM_mirror, WM_mirror_once, WM_border_color
75  };
76  enum FilterType {
77  // Note that these type values match up, name-for-name, with a similar
78  // enumerated type in Panda's Texture object. However, they do *not*
79  // match up numerically. You must convert between them using a switch
80  // statement.
81  FT_unspecified,
82 
83  // Mag Filter and Min Filter
84  FT_nearest,
85  FT_linear,
86 
87  // Min Filter Only
88  FT_nearest_mipmap_nearest, // "mipmap point"
89  FT_linear_mipmap_nearest, // "mipmap linear"
90  FT_nearest_mipmap_linear, // "mipmap bilinear"
91  FT_linear_mipmap_linear, // "mipmap trilinear"
92  };
93  enum EnvType {
94  ET_unspecified,
95  ET_modulate,
96  ET_decal,
97  ET_blend,
98  ET_replace,
99  ET_add,
100  ET_blend_color_scale,
101  ET_modulate_glow,
102  ET_modulate_gloss,
103  ET_normal,
104  ET_normal_height,
105  ET_glow,
106  ET_gloss,
107  ET_height,
108  ET_selector,
109  ET_normal_gloss,
110  };
111  enum CombineMode {
112  CM_unspecified,
113  CM_replace,
114  CM_modulate,
115  CM_add,
116  CM_add_signed,
117  CM_interpolate,
118  CM_subtract,
119  CM_dot3_rgb,
120  CM_dot3_rgba,
121  };
122  enum CombineChannel {
123  CC_rgb = 0,
124  CC_alpha = 1,
125  CC_num_channels = 2,
126  };
127  enum CombineIndex {
128  CI_num_indices = 3
129  };
130  enum CombineSource {
131  CS_unspecified,
132  CS_texture,
133  CS_constant,
134  CS_primary_color,
135  CS_previous,
136  CS_constant_color_scale,
137  CS_last_saved_result,
138  };
139  enum CombineOperand {
140  CO_unspecified,
141  CO_src_color,
142  CO_one_minus_src_color,
143  CO_src_alpha,
144  CO_one_minus_src_alpha,
145  };
146  enum TexGen {
147  TG_unspecified,
148 
149  TG_eye_sphere_map,
150 
151  TG_world_cube_map,
152  TG_eye_cube_map,
153 
154  TG_world_normal,
155  TG_eye_normal,
156 
157  TG_world_position,
158  TG_eye_position,
159 
160  TG_point_sprite,
161  };
162  enum QualityLevel {
163  QL_unspecified,
164  QL_default,
165  QL_fastest,
166  QL_normal,
167  QL_best,
168  };
169 
170  INLINE void set_texture_type(TextureType texture_type);
171  INLINE TextureType get_texture_type() const;
172 
173  INLINE void set_format(Format format);
174  INLINE Format get_format() const;
175 
176  INLINE void set_compression_mode(CompressionMode mode);
177  INLINE CompressionMode get_compression_mode() const;
178 
179  INLINE void set_wrap_mode(WrapMode mode);
180  INLINE WrapMode get_wrap_mode() const;
181 
182  INLINE void set_wrap_u(WrapMode mode);
183  INLINE WrapMode get_wrap_u() const;
184  INLINE WrapMode determine_wrap_u() const;
185 
186  INLINE void set_wrap_v(WrapMode mode);
187  INLINE WrapMode get_wrap_v() const;
188  INLINE WrapMode determine_wrap_v() const;
189 
190  INLINE void set_wrap_w(WrapMode mode);
191  INLINE WrapMode get_wrap_w() const;
192  INLINE WrapMode determine_wrap_w() const;
193 
194  INLINE void set_minfilter(FilterType type);
195  INLINE FilterType get_minfilter() const;
196 
197  INLINE void set_magfilter(FilterType type);
198  INLINE FilterType get_magfilter() const;
199 
200  INLINE void set_anisotropic_degree(int anisotropic_degree);
201  INLINE void clear_anisotropic_degree();
202  INLINE bool has_anisotropic_degree() const;
203  INLINE int get_anisotropic_degree() const;
204 
205  INLINE void set_env_type(EnvType type);
206  INLINE EnvType get_env_type() const;
207  bool affects_polygon_alpha() const;
208 
209  INLINE void set_combine_mode(CombineChannel channel, CombineMode cm);
210  INLINE CombineMode get_combine_mode(CombineChannel channel) const;
211  INLINE void set_combine_source(CombineChannel channel, int n, CombineSource cs);
212  INLINE CombineSource get_combine_source(CombineChannel channel, int n) const;
213  INLINE void set_combine_operand(CombineChannel channel, int n, CombineOperand co);
214  INLINE CombineOperand get_combine_operand(CombineChannel channel, int n) const;
215 
216  INLINE void set_saved_result(bool saved_result);
217  INLINE bool get_saved_result() const;
218 
219  INLINE void set_tex_gen(TexGen tex_gen);
220  INLINE TexGen get_tex_gen() const;
221 
222  INLINE void set_quality_level(QualityLevel quality_level);
223  INLINE QualityLevel get_quality_level() const;
224 
225  INLINE void set_stage_name(const std::string &stage_name);
226  INLINE void clear_stage_name();
227  INLINE bool has_stage_name() const;
228  INLINE const std::string &get_stage_name() const;
229 
230  INLINE void set_priority(int priority);
231  INLINE void clear_priority();
232  INLINE bool has_priority() const;
233  INLINE int get_priority() const;
234 
235  INLINE void set_color(const LColor &color);
236  INLINE void clear_color();
237  INLINE bool has_color() const;
238  INLINE const LColor &get_color() const;
239 
240  INLINE void set_border_color(const LColor &border_color);
241  INLINE void clear_border_color();
242  INLINE bool has_border_color() const;
243  INLINE const LColor &get_border_color() const;
244 
245  INLINE void set_uv_name(const std::string &uv_name);
246  INLINE void clear_uv_name();
247  INLINE bool has_uv_name() const;
248  INLINE const std::string &get_uv_name() const;
249 
250  INLINE void set_rgb_scale(int rgb_scale);
251  INLINE void clear_rgb_scale();
252  INLINE bool has_rgb_scale() const;
253  INLINE int get_rgb_scale() const;
254 
255  INLINE void set_alpha_scale(int alpha_scale);
256  INLINE void clear_alpha_scale();
257  INLINE bool has_alpha_scale() const;
258  INLINE int get_alpha_scale() const;
259 
260  INLINE void set_alpha_filename(const Filename &filename);
261  INLINE void clear_alpha_filename();
262  INLINE bool has_alpha_filename() const;
263  INLINE const Filename &get_alpha_filename() const;
264 
265  INLINE void set_alpha_fullpath(const Filename &fullpath);
266  INLINE const Filename &get_alpha_fullpath() const;
267 
268  INLINE void set_alpha_file_channel(int alpha_file_channel);
269  INLINE void clear_alpha_file_channel();
270  INLINE bool has_alpha_file_channel() const;
271  INLINE int get_alpha_file_channel() const;
272 
273  INLINE void set_multiview(bool multiview);
274  INLINE bool get_multiview() const;
275 
276  INLINE void set_num_views(int num_views);
277  INLINE void clear_num_views();
278  INLINE bool has_num_views() const;
279  INLINE int get_num_views() const;
280 
281  INLINE void set_read_mipmaps(bool read_mipmaps);
282  INLINE bool get_read_mipmaps() const;
283 
284  INLINE void set_min_lod(double min_lod);
285  INLINE void clear_min_lod();
286  INLINE bool has_min_lod() const;
287  INLINE double get_min_lod() const;
288 
289  INLINE void set_max_lod(double max_lod);
290  INLINE void clear_max_lod();
291  INLINE bool has_max_lod() const;
292  INLINE double get_max_lod() const;
293 
294  INLINE void set_lod_bias(double lod_bias);
295  INLINE void clear_lod_bias();
296  INLINE bool has_lod_bias() const;
297  INLINE double get_lod_bias() const;
298 
299  void clear_multitexture();
300  bool multitexture_over(EggTexture *other);
301  INLINE int get_multitexture_sort() const;
302 
303  static TextureType string_texture_type(const std::string &string);
304  static Format string_format(const std::string &string);
305  static CompressionMode string_compression_mode(const std::string &string);
306  static WrapMode string_wrap_mode(const std::string &string);
307  static FilterType string_filter_type(const std::string &string);
308  static EnvType string_env_type(const std::string &string);
309  static CombineMode string_combine_mode(const std::string &string);
310  static CombineSource string_combine_source(const std::string &string);
311  static CombineOperand string_combine_operand(const std::string &string);
312  static TexGen string_tex_gen(const std::string &string);
313  static QualityLevel string_quality_level(const std::string &string);
314 
315 PUBLISHED:
316  MAKE_PROPERTY(texture_type, get_texture_type, set_texture_type);
317  MAKE_PROPERTY(format, get_format, set_format);
318  MAKE_PROPERTY(compression_mode, get_compression_mode, set_compression_mode);
319  MAKE_PROPERTY(wrap_mode, get_wrap_mode, set_wrap_mode);
320  MAKE_PROPERTY(wrap_u, get_wrap_u, set_wrap_u);
321  MAKE_PROPERTY(wrap_v, get_wrap_v, set_wrap_v);
322  MAKE_PROPERTY(wrap_w, get_wrap_w, set_wrap_w);
323  MAKE_PROPERTY(minfilter, get_minfilter, set_minfilter);
324  MAKE_PROPERTY(magfilter, get_magfilter, set_magfilter);
325  MAKE_PROPERTY2(anisotropic_degree, has_anisotropic_degree, get_anisotropic_degree,
326  set_anisotropic_degree, clear_anisotropic_degree);
327  MAKE_PROPERTY(env_type, get_env_type, set_env_type);
328  MAKE_PROPERTY(saved_result, get_saved_result, set_saved_result);
329  MAKE_PROPERTY(tex_gen, get_tex_gen, set_tex_gen);
330  MAKE_PROPERTY(quality_level, get_quality_level, set_quality_level);
331  MAKE_PROPERTY2(stage_name, has_stage_name, get_stage_name,
332  set_stage_name, clear_stage_name);
333  MAKE_PROPERTY2(priority, has_priority, get_priority,
334  set_priority, clear_priority);
335  MAKE_PROPERTY2(color, has_color, get_color,
336  set_color, clear_color);
337  MAKE_PROPERTY2(border_color, has_border_color, get_border_color,
338  set_border_color, clear_border_color);
339  MAKE_PROPERTY2(uv_name, has_uv_name, get_uv_name,
340  set_uv_name, clear_uv_name);
341  MAKE_PROPERTY2(rgb_scale, has_rgb_scale, get_rgb_scale,
342  set_rgb_scale, clear_rgb_scale);
343  MAKE_PROPERTY2(alpha_scale, has_alpha_scale, get_alpha_scale,
344  set_alpha_scale, clear_alpha_scale);
345  MAKE_PROPERTY2(alpha_filename, has_alpha_filename, get_alpha_filename,
346  set_alpha_filename, clear_alpha_filename);
347  MAKE_PROPERTY(alpha_fullpath, get_alpha_fullpath, set_alpha_fullpath);
348  MAKE_PROPERTY2(alpha_file_channel, has_alpha_file_channel, get_alpha_file_channel,
349  set_alpha_file_channel, clear_alpha_file_channel);
350  MAKE_PROPERTY(multiview, get_multiview, set_multiview);
351  MAKE_PROPERTY2(num_views, has_num_views, get_num_views,
352  set_num_views, clear_num_views);
353  MAKE_PROPERTY(read_mipmaps, get_read_mipmaps, set_read_mipmaps);
354  MAKE_PROPERTY2(min_lod, has_min_lod, get_min_lod,
355  set_min_lod, clear_min_lod);
356  MAKE_PROPERTY2(max_lod, has_max_lod, get_max_lod,
357  set_max_lod, clear_max_lod);
358  MAKE_PROPERTY2(lod_bias, has_lod_bias, get_lod_bias,
359  set_lod_bias, clear_lod_bias);
360 
361  MAKE_PROPERTY(multitexture_sort, get_multitexture_sort);
362 
363 public:
364  virtual EggTransform *as_transform();
365 
366 protected:
367  virtual bool egg_start_parse_body();
368 
369 private:
371  bool r_min_multitexture_sort(int sort, MultiTextures &cycle_detector);
372 
373  enum Flags {
374  F_has_alpha_filename = 0x0002,
375  F_has_anisotropic_degree = 0x0004,
376  F_has_alpha_file_channel = 0x0008,
377  F_has_stage_name = 0x0010,
378  F_has_uv_name = 0x0020,
379  F_has_priority = 0x0040,
380  F_has_color = 0x0080,
381  F_has_rgb_scale = 0x0100,
382  F_has_alpha_scale = 0x0200,
383  F_has_border_color = 0x0400,
384  F_has_num_views = 0x0800,
385  F_has_min_lod = 0x1000,
386  F_has_max_lod = 0x2000,
387  F_has_lod_bias = 0x4000,
388  };
389 
390  TextureType _texture_type;
391  Format _format;
392  CompressionMode _compression_mode;
393  WrapMode _wrap_mode, _wrap_u, _wrap_v, _wrap_w;
394  FilterType _minfilter, _magfilter;
395  int _anisotropic_degree;
396  EnvType _env_type;
397  bool _saved_result;
398  bool _multiview;
399  int _num_views;
400  TexGen _tex_gen;
401  QualityLevel _quality_level;
402  std::string _stage_name;
403  int _priority;
404  LColor _color;
405  LColor _border_color;
406  std::string _uv_name;
407  int _rgb_scale;
408  int _alpha_scale;
409  int _flags;
410  Filename _alpha_filename;
411  Filename _alpha_fullpath;
412  int _alpha_file_channel;
413  bool _read_mipmaps;
414  int _multitexture_sort;
415  double _min_lod;
416  double _max_lod;
417  double _lod_bias;
418 
419  class SourceAndOperand {
420  public:
421  INLINE SourceAndOperand();
422  CombineSource _source;
423  CombineOperand _operand;
424  };
425 
426  class Combiner {
427  public:
428  INLINE Combiner();
429  CombineMode _mode;
430  SourceAndOperand _ops[CI_num_indices];
431  };
432 
433  Combiner _combiner[CC_num_channels];
434 
435  // This is the set of all of the textures that are multitextured on top of
436  // (and under) this one. This is filled in by multitexture_over().
437  MultiTextures _over_textures, _under_textures;
438 
439 public:
440  static TypeHandle get_class_type() {
441  return _type_handle;
442  }
443  static void init_type() {
444  EggFilenameNode::init_type();
445  EggRenderMode::init_type();
446  register_type(_type_handle, "EggTexture",
447  EggFilenameNode::get_class_type(),
448  EggRenderMode::get_class_type());
449  }
450  virtual TypeHandle get_type() const {
451  return get_class_type();
452  }
453  virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
454 
455 private:
456  static TypeHandle _type_handle;
457 };
458 
459 /**
460  * An STL function object for sorting textures into order by properties.
461  * Returns true if the two referenced EggTexture pointers are in sorted order,
462  * false otherwise.
463  */
464 class EXPCL_PANDA_EGG UniqueEggTextures {
465 public:
466  INLINE UniqueEggTextures(int eq = ~0);
467  INLINE bool operator ()(const EggTexture *t1, const EggTexture *t2) const;
468 
469  int _eq;
470 };
471 
472 INLINE std::ostream &operator << (std::ostream &out, const EggTexture &n) {
473  return out << n.get_filename();
474 }
475 
476 EXPCL_PANDA_EGG std::ostream &operator << (std::ostream &out, EggTexture::TextureType texture_type);
477 EXPCL_PANDA_EGG std::ostream &operator << (std::ostream &out, EggTexture::Format format);
478 EXPCL_PANDA_EGG std::ostream &operator << (std::ostream &out, EggTexture::CompressionMode mode);
479 EXPCL_PANDA_EGG std::ostream &operator << (std::ostream &out, EggTexture::WrapMode mode);
480 EXPCL_PANDA_EGG std::ostream &operator << (std::ostream &out, EggTexture::FilterType type);
481 EXPCL_PANDA_EGG std::ostream &operator << (std::ostream &out, EggTexture::EnvType type);
482 EXPCL_PANDA_EGG std::ostream &operator << (std::ostream &out, EggTexture::CombineMode cm);
483 EXPCL_PANDA_EGG std::ostream &operator << (std::ostream &out, EggTexture::CombineChannel cc);
484 EXPCL_PANDA_EGG std::ostream &operator << (std::ostream &out, EggTexture::CombineSource cs);
485 EXPCL_PANDA_EGG std::ostream &operator << (std::ostream &out, EggTexture::CombineOperand co);
486 EXPCL_PANDA_EGG std::ostream &operator << (std::ostream &out, EggTexture::TexGen tex_gen);
487 EXPCL_PANDA_EGG std::ostream &operator << (std::ostream &out, EggTexture::QualityLevel quality_level);
488 
489 #include "eggTexture.I"
490 
491 #endif
EggFilenameNode
This is an egg node that contains a filename.
Definition: eggFilenameNode.h:27
UniqueEggTextures
An STL function object for sorting textures into order by properties.
Definition: eggTexture.h:464
pandabase.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
register_type
void register_type(TypeHandle &type_handle, const std::string &name)
This inline function is just a convenient way to call TypeRegistry::register_type(),...
Definition: register_type.I:22
EggFilenameNode::get_filename
const Filename & get_filename() const
Returns a nonmodifiable reference to the filename.
Definition: eggFilenameNode.I:58
EggRenderMode::write
void write(std::ostream &out, int indent_level) const
Writes the attributes to the indicated output stream in Egg format.
Definition: eggRenderMode.cxx:60
TypeHandle
TypeHandle is the identifier used to differentiate C++ class types.
Definition: typeHandle.h:81
luse.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
eggFilenameNode.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
eggRenderMode.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
eggTransform.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
pset.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
EggTexture
Defines a texture map that may be applied to geometry.
Definition: eggTexture.h:30
EggObject::as_transform
virtual EggTransform * as_transform()
Returns this object cross-cast to an EggTransform pointer, if it inherits from EggTransform,...
Definition: eggObject.cxx:151
EggRenderMode
This class stores miscellaneous rendering properties that is associated with geometry,...
Definition: eggRenderMode.h:31
Filename
The name of a file, such as a texture file or an Egg file.
Definition: filename.h:39
eggTexture.I
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
pset< EggTexture * >
EggTransform
This represents the <Transform> entry of a group or texture node: a list of component transform opera...
Definition: eggTransform.h:29