Panda3D
eggTexture.cxx
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.cxx
10  * @author drose
11  * @date 1999-01-18
12  */
13 
14 #include "eggTexture.h"
15 #include "eggMiscFuncs.h"
16 #include "lexerDefs.h"
17 
18 #include "indent.h"
19 #include "string_utils.h"
20 
21 using std::ostream;
22 using std::string;
23 
24 TypeHandle EggTexture::_type_handle;
25 
26 
27 /**
28  *
29  */
30 EggTexture::
31 EggTexture(const string &tref_name, const Filename &filename)
32  : EggFilenameNode(tref_name, filename)
33 {
34  _texture_type = TT_unspecified;
35  _format = F_unspecified;
36  _compression_mode = CM_default;
37  _wrap_mode = WM_unspecified;
38  _wrap_u = WM_unspecified;
39  _wrap_v = WM_unspecified;
40  _wrap_w = WM_unspecified;
41  _minfilter = FT_unspecified;
42  _magfilter = FT_unspecified;
43  _anisotropic_degree = 0;
44  _env_type = ET_unspecified;
45  _saved_result = false;
46  _multiview = false;
47  _num_views = 0;
48  _tex_gen = TG_unspecified;
49  _quality_level = QL_unspecified;
50  _priority = 0;
51  _color.set(0.0f, 0.0f, 0.0f, 1.0f);
52  _border_color.set(0.0f, 0.0f, 0.0f, 1.0f);
53  _flags = 0;
54  _alpha_file_channel = 0;
55  _read_mipmaps = false;
56  _multitexture_sort = 0;
57 }
58 
59 /**
60  *
61  */
62 EggTexture::
63 EggTexture(const EggTexture &copy) {
64  (*this) = copy;
65 }
66 
67 /**
68  *
69  */
70 EggTexture &EggTexture::
71 operator = (const EggTexture &copy) {
73 
74  EggFilenameNode::operator = (copy);
75  EggRenderMode::operator = (copy);
76  EggTransform::operator = (copy);
77 
78  _texture_type = copy._texture_type;
79  _format = copy._format;
80  _compression_mode = copy._compression_mode;
81  _wrap_mode = copy._wrap_mode;
82  _wrap_u = copy._wrap_u;
83  _wrap_v = copy._wrap_v;
84  _wrap_w = copy._wrap_w;
85  _minfilter = copy._minfilter;
86  _magfilter = copy._magfilter;
87  _anisotropic_degree = copy._anisotropic_degree;
88  _env_type = copy._env_type;
89  _saved_result = copy._saved_result;
90  _multiview = copy._multiview;
91  _num_views = copy._num_views;
92  _tex_gen = copy._tex_gen;
93  _quality_level = copy._quality_level;
94  _stage_name = copy._stage_name;
95  _priority = copy._priority;
96  _color = copy._color;
97  _border_color = copy._border_color;
98  _uv_name = copy._uv_name;
99  _rgb_scale = 1;
100  _alpha_scale = 1;
101  _flags = copy._flags;
102  _alpha_filename = copy._alpha_filename;
103  _alpha_fullpath = copy._alpha_fullpath;
104  _alpha_file_channel = copy._alpha_file_channel;
105  _read_mipmaps = copy._read_mipmaps;
106  _multitexture_sort = 0;
107  _combiner[0] = copy._combiner[0];
108  _combiner[1] = copy._combiner[1];
109 
110  return *this;
111 }
112 
113 /**
114  *
115  */
116 EggTexture::
117 ~EggTexture() {
119 }
120 
121 /**
122  * Writes the texture definition to the indicated output stream in Egg format.
123  */
124 void EggTexture::
125 write(ostream &out, int indent_level) const {
126  write_header(out, indent_level, "<Texture>");
127  enquote_string(out, get_filename(), indent_level + 2) << "\n";
128 
129  if (has_alpha_filename()) {
130  indent(out, indent_level + 2)
131  << "<Scalar> alpha-file { ";
133  out << " }\n";
134  }
135 
136  if (has_alpha_file_channel()) {
137  indent(out, indent_level + 2)
138  << "<Scalar> alpha-file-channel { "
139  << get_alpha_file_channel() << " }\n";
140  }
141 
142  if (get_read_mipmaps()) {
143  indent(out, indent_level + 2)
144  << "<Scalar> read-mipmaps { 1 }\n";
145  }
146 
147  if (get_texture_type() != TT_unspecified) {
148  indent(out, indent_level + 2)
149  << "<Scalar> type { " << get_texture_type() << " }\n";
150  }
151 
152  if (get_format() != F_unspecified) {
153  indent(out, indent_level + 2)
154  << "<Scalar> format { " << get_format() << " }\n";
155  }
156 
157  if (get_compression_mode() != CM_default) {
158  indent(out, indent_level + 2)
159  << "<Scalar> compression { " << get_compression_mode() << " }\n";
160  }
161 
162  if (get_wrap_mode() != WM_unspecified) {
163  indent(out, indent_level + 2)
164  << "<Scalar> wrap { " << get_wrap_mode() << " }\n";
165  }
166 
167  if (get_wrap_u() != WM_unspecified) {
168  indent(out, indent_level + 2)
169  << "<Scalar> wrapu { " << get_wrap_u() << " }\n";
170  }
171 
172  if (get_wrap_v() != WM_unspecified) {
173  indent(out, indent_level + 2)
174  << "<Scalar> wrapv { " << get_wrap_v() << " }\n";
175  }
176 
177  if (get_wrap_w() != WM_unspecified) {
178  indent(out, indent_level + 2)
179  << "<Scalar> wrapw { " << get_wrap_w() << " }\n";
180  }
181 
182  if (get_minfilter() != FT_unspecified) {
183  indent(out, indent_level + 2)
184  << "<Scalar> minfilter { " << get_minfilter() << " }\n";
185  }
186 
187  if (get_magfilter() != FT_unspecified) {
188  indent(out, indent_level + 2)
189  << "<Scalar> magfilter { " << get_magfilter() << " }\n";
190  }
191 
192  if (has_anisotropic_degree()) {
193  indent(out, indent_level + 2)
194  << "<Scalar> anisotropic-degree { " << get_anisotropic_degree() << " }\n";
195  }
196 
197  if (get_env_type() != ET_unspecified) {
198  indent(out, indent_level + 2)
199  << "<Scalar> envtype { " << get_env_type() << " }\n";
200  }
201 
202  for (int ci = 0; ci < (int)CC_num_channels; ci++) {
203  CombineChannel channel = (CombineChannel)ci;
204  if (get_combine_mode(channel) != CM_unspecified) {
205  indent(out, indent_level + 2)
206  << "<Scalar> combine-" << channel
207  << " { " << get_combine_mode(channel) << " }\n";
208  }
209  for (int i = 0; i < (int)CI_num_indices; i++) {
210  if (get_combine_source(channel, i) != CS_unspecified) {
211  indent(out, indent_level + 2)
212  << "<Scalar> combine-" << channel << "-source" << i
213  << " { " << get_combine_source(channel, i) << " }\n";
214  }
215  if (get_combine_operand(channel, i) != CO_unspecified) {
216  indent(out, indent_level + 2)
217  << "<Scalar> combine-" << channel << "-operand" << i
218  << " { " << get_combine_operand(channel, i) << " }\n";
219  }
220  }
221  }
222 
223  if (get_saved_result()) {
224  indent(out, indent_level + 2)
225  << "<Scalar> saved-result { 1 }\n";
226  }
227 
228  if (get_tex_gen() != TG_unspecified) {
229  indent(out, indent_level + 2)
230  << "<Scalar> tex-gen { " << get_tex_gen() << " }\n";
231  }
232 
233  if (get_quality_level() != QL_unspecified) {
234  indent(out, indent_level + 2)
235  << "<Scalar> quality-level { " << get_quality_level() << " }\n";
236  }
237 
238  if (has_stage_name()) {
239  indent(out, indent_level + 2)
240  << "<Scalar> stage-name { " << get_stage_name() << " }\n";
241  }
242 
243  if (has_priority()) {
244  indent(out, indent_level + 2)
245  << "<Scalar> priority { " << get_priority() << " }\n";
246  }
247 
248  if (has_color()) {
249  indent(out, indent_level + 2)
250  << "<Scalar> blendr { " << _color[0] << " }\n";
251  indent(out, indent_level + 2)
252  << "<Scalar> blendg { " << _color[1] << " }\n";
253  indent(out, indent_level + 2)
254  << "<Scalar> blendb { " << _color[2] << " }\n";
255  indent(out, indent_level + 2)
256  << "<Scalar> blenda { " << _color[3] << " }\n";
257  }
258 
259  if (has_border_color()) {
260  indent(out, indent_level + 2)
261  << "<Scalar> borderr { " << _border_color[0] << " }\n";
262  indent(out, indent_level + 2)
263  << "<Scalar> borderg { " << _border_color[1] << " }\n";
264  indent(out, indent_level + 2)
265  << "<Scalar> borderb { " << _border_color[2] << " }\n";
266  indent(out, indent_level + 2)
267  << "<Scalar> bordera { " << _border_color[3] << " }\n";
268  }
269 
270  if (has_uv_name()) {
271  indent(out, indent_level + 2)
272  << "<Scalar> uv-name { " << get_uv_name() << " }\n";
273  }
274 
275  if (has_rgb_scale()) {
276  indent(out, indent_level + 2)
277  << "<Scalar> rgb-scale { " << get_rgb_scale() << " }\n";
278  }
279 
280  if (has_alpha_scale()) {
281  indent(out, indent_level + 2)
282  << "<Scalar> alpha-scale { " << get_alpha_scale() << " }\n";
283  }
284 
285  if (get_multiview()) {
286  indent(out, indent_level + 2)
287  << "<Scalar> multiview { 1 }\n";
288  }
289 
290  if (has_num_views()) {
291  indent(out, indent_level + 2)
292  << "<Scalar> num-views { " << get_num_views() << " }\n";
293  }
294 
295  EggRenderMode::write(out, indent_level + 2);
296 
297  if (has_transform()) {
298  EggTransform::write(out, indent_level + 2, "<Transform>");
299  }
300 
301  indent(out, indent_level) << "}\n";
302 }
303 
304 /**
305  * Returns true if the two textures are equivalent in all relevant properties
306  * (according to eq), false otherwise.
307  *
308  * The Equivalence parameter, eq, should be set to the bitwise OR of the
309  * following properties, according to what you consider relevant:
310  *
311  * EggTexture::E_basename: The basename part of the texture filename, without
312  * the directory prefix *or* the filename extension.
313  *
314  * EggTexture::E_extension: The extension part of the texture filename.
315  *
316  * EggTexture::E_dirname: The directory prefix of the texture filename.
317  *
318  * EggTexture::E_complete_filename: The union of the above three; that is, the
319  * complete filename, with directory, basename, and extension.
320  *
321  * EggTexture::E_transform: The texture matrix.
322  *
323  * EggTexture::E_attributes: All remaining texture attributes (mode, mipmap,
324  * etc.) except TRef name.
325  *
326  * EggTexture::E_tref_name: The TRef name.
327  */
328 bool EggTexture::
329 is_equivalent_to(const EggTexture &other, int eq) const {
330  if ((eq & E_complete_filename) == E_complete_filename) {
331  // cout << "compared by filename" << endl;
332  if (get_filename() != other.get_filename()) {
333  return false;
334  }
335  } else {
336  // cout << "compared by not complete filename" << endl;
337  const Filename &a = get_filename();
338  const Filename &b = other.get_filename();
339 
340  if (eq & E_basename) {
342  return false;
343  }
344  }
345  if (eq & E_extension) {
346  if (a.get_extension() != b.get_extension()) {
347  return false;
348  }
349  }
350  if (eq & E_dirname) {
351  if (a.get_dirname() != b.get_dirname()) {
352  return false;
353  }
354  }
355  }
356 
357  if (eq & E_transform) {
358  // cout << "compared by transform" << endl;
359  if (transform_is_identity() != other.transform_is_identity()) {
360  return false;
361  }
362 
363  if (has_transform() && other.has_transform()) {
364  if (!get_transform3d().almost_equal(other.get_transform3d(), 0.0001)) {
365  return false;
366  }
367  }
368  }
369 
370  if (eq & E_attributes) {
371  // cout << "compared by attributes" << endl;
372  if (_texture_type != other._texture_type ||
373  _format != other._format ||
374  _compression_mode != other._compression_mode ||
375  _wrap_mode != other._wrap_mode ||
376  _wrap_u != other._wrap_u ||
377  _wrap_v != other._wrap_v ||
378  _wrap_w != other._wrap_w ||
379  _minfilter != other._minfilter ||
380  _magfilter != other._magfilter ||
381  _env_type != other._env_type) {
382  return false;
383  }
384  if (EggRenderMode::operator != (other)) {
385  return false;
386  }
387  }
388 
389  if (eq & E_tref_name) {
390  // cout << "compared by tref_name" << endl;
391  if (get_name() != other.get_name()) {
392  return false;
393  }
394  }
395 
396  return true;
397 }
398 
399 /**
400  * An ordering operator to compare two textures for sorting order. This
401  * imposes an arbitrary ordering useful to identify unique textures, according
402  * to the indicated Equivalence factor. See is_equivalent_to().
403  */
404 bool EggTexture::
405 sorts_less_than(const EggTexture &other, int eq) const {
406  if ((eq & E_complete_filename) == E_complete_filename) {
407  if (get_filename() != other.get_filename()) {
408  return get_filename() < other.get_filename();
409  }
410  } else {
411  const Filename &a = get_filename();
412  const Filename &b = other.get_filename();
413 
414  if (eq & E_basename) {
417  }
418  }
419  if (eq & E_extension) {
420  if (a.get_extension() != b.get_extension()) {
421  return a.get_extension() < b.get_extension();
422  }
423  }
424  if (eq & E_dirname) {
425  if (a.get_dirname() != b.get_dirname()) {
426  return a.get_dirname() < b.get_dirname();
427  }
428  }
429  }
430 
431  if (eq & E_transform) {
432  bool is_identity = transform_is_identity();
433  bool other_is_identity = other.transform_is_identity();
434  if (is_identity != other_is_identity) {
435  return (int)is_identity < (int)other_is_identity;
436  }
437 
438  if (has_transform() && other.has_transform()) {
439  int compare = get_transform3d().compare_to(other.get_transform3d());
440  if (compare != 0) {
441  return compare < 0;
442  }
443  }
444  }
445 
446  if (eq & E_attributes) {
447  if (_texture_type != other._texture_type) {
448  return (int)_texture_type < (int)other._texture_type;
449  }
450  if (_format != other._format) {
451  return (int)_format < (int)other._format;
452  }
453  if (_compression_mode != other._compression_mode) {
454  return (int)_compression_mode < (int)other._compression_mode;
455  }
456  if (_wrap_mode != other._wrap_mode) {
457  return (int)_wrap_mode < (int)other._wrap_mode;
458  }
459  if (_wrap_u != other._wrap_u) {
460  return (int)_wrap_u < (int)other._wrap_u;
461  }
462  if (_wrap_v != other._wrap_v) {
463  return (int)_wrap_v < (int)other._wrap_v;
464  }
465  if (_wrap_w != other._wrap_w) {
466  return (int)_wrap_w < (int)other._wrap_w;
467  }
468  if (_minfilter != other._minfilter) {
469  return (int)_minfilter < (int)other._minfilter;
470  }
471  if (_magfilter != other._magfilter) {
472  return (int)_magfilter < (int)other._magfilter;
473  }
474  if (_anisotropic_degree != other._anisotropic_degree) {
475  return _anisotropic_degree < other._anisotropic_degree;
476  }
477  if (_env_type != other._env_type) {
478  return (int)_env_type < (int)other._env_type;
479  }
480  if (EggRenderMode::operator != (other)) {
481  return EggRenderMode::operator < (other);
482  }
483  }
484 
485  if (eq & E_tref_name) {
486  if (get_name() != other.get_name()) {
487  return get_name() < other.get_name();
488  }
489  }
490 
491  return false;
492 }
493 
494 /**
495  * Given the number of color components (channels) in the image file as
496  * actually read from the disk, return true if this texture seems to have an
497  * alpha channel or not. This depends on the EggTexture's format as well as
498  * the number of channels.
499  */
500 bool EggTexture::
501 has_alpha_channel(int num_components) const {
502  switch (_format) {
503  case F_red:
504  case F_green:
505  case F_blue:
506  case F_luminance:
507  case F_rgb:
508  case F_rgb12:
509  case F_rgb8:
510  case F_rgb5:
511  case F_rgb332:
512  // These formats never use alpha, regardless of the number of components
513  // we have.
514  return false;
515 
516  case F_alpha:
517  // This format always uses alpha.
518  return true;
519 
520  case F_luminance_alpha:
521  case F_luminance_alphamask:
522  case F_rgba:
523  case F_rgbm:
524  case F_rgba12:
525  case F_rgba8:
526  case F_rgba4:
527  case F_rgba5:
528  case F_unspecified:
529  // These formats use alpha if the image had alpha.
530  return (num_components == 2 || num_components == 4);
531  }
532 
533  return false;
534 }
535 
536 /**
537  * Returns true if this texture's environment type or combine mode allows the
538  * texture to have an effect on the polygon's alpha values, false otherwise.
539  */
540 bool EggTexture::
542  switch (_env_type) {
543  case ET_modulate:
544  case ET_replace:
545  return true;
546 
547  case ET_decal:
548  case ET_blend:
549  case ET_add:
550  case ET_blend_color_scale:
551  case ET_modulate_glow:
552  case ET_modulate_gloss:
553  case ET_normal:
554  case ET_normal_height:
555  case ET_glow:
556  case ET_gloss:
557  case ET_height:
558  case ET_normal_gloss:
559  return false;
560 
561  case ET_selector:
562  return true;
563 
564  case ET_unspecified:
565  break;
566  }
567 
568  switch (_combiner[CC_alpha]._mode) {
569  case CM_replace:
570  case CM_modulate:
571  case CM_add_signed:
572  case CM_subtract:
573  return true;
574 
575  case CM_interpolate:
576  case CM_add:
577  case CM_dot3_rgb:
578  case CM_dot3_rgba:
579  return false;
580 
581  case CM_unspecified:
582  break;
583  }
584 
585  // A completely unspecified texture environment implies "modulate", which
586  // does affect alpha.
587  return true;
588 }
589 
590 
591 /**
592  * Resets the multitexture flags set by multitexture_over(). After this call,
593  * get_multitexture() will return false, and get_multitexture_sort() will
594  * return 0.
595  */
596 void EggTexture::
598  _multitexture_sort = 0;
599 
600  // Now empty out the _over_textures and _under_textures sets. This requires
601  // a bit of care so we don't end up in mutual recursion or iterating through
602  // self-modifying structures. To avoid this, we empty the sets first, and
603  // then walk through their original contents.
604  MultiTextures orig_over_textures, orig_under_textures;
605  orig_over_textures.swap(_over_textures);
606  orig_under_textures.swap(_under_textures);
607 
608  MultiTextures::iterator mti;
609  for (mti = orig_over_textures.begin();
610  mti != orig_over_textures.end();
611  ++mti) {
612  EggTexture *other = (*mti);
613  other->_under_textures.erase(this);
614  }
615  for (mti = orig_under_textures.begin();
616  mti != orig_under_textures.end();
617  ++mti) {
618  EggTexture *other = (*mti);
619  other->_over_textures.erase(this);
620  }
621 }
622 
623 /**
624  * Indicates that this texture should be layered on top of the other texture.
625  * This will guarantee that this->get_multitexture_sort() >
626  * other->get_multitexture_sort(), at least until clear_multitexture() is
627  * called on either one.
628  *
629  * The return value is true if successful, or false if there is a failure
630  * because the other texture was already layered on top of this one (or there
631  * is a three- or more-way cycle).
632  */
633 bool EggTexture::
635  if (get_multitexture_sort() <= other->get_multitexture_sort()) {
636  MultiTextures cycle_detector;
637  if (!r_min_multitexture_sort(other->get_multitexture_sort() + 1,
638  cycle_detector)) {
639  // Found a cycle right off the bat!
640  return false;
641  }
642  }
643 
644  if (_over_textures.insert(other).second) {
645  bool inserted_under = other->_under_textures.insert(this).second;
646  nassertr(inserted_under, false);
647  }
648  nassertr(get_multitexture_sort() > other->get_multitexture_sort(), false);
649 
650  return true;
651 }
652 
653 /**
654  * Returns the Texture_ype value associated with the given string
655  * representation, or TT_unspecified if the string does not match any known
656  * TextureType value.
657  */
658 EggTexture::TextureType EggTexture::
659 string_texture_type(const string &string) {
660  if (cmp_nocase_uh(string, "1d") == 0 ||
661  cmp_nocase_uh(string, "1dtexture") == 0 ||
662  cmp_nocase_uh(string, "1d_texture") == 0) {
663  return TT_1d_texture;
664 
665  } else if (cmp_nocase_uh(string, "2d") == 0 ||
666  cmp_nocase_uh(string, "2dtexture") == 0 ||
667  cmp_nocase_uh(string, "2d_texture") == 0) {
668  return TT_2d_texture;
669 
670  } else if (cmp_nocase_uh(string, "3d") == 0 ||
671  cmp_nocase_uh(string, "3dtexture") == 0 ||
672  cmp_nocase_uh(string, "3d_texture") == 0) {
673  return TT_3d_texture;
674 
675  } else if (cmp_nocase_uh(string, "cube") == 0 ||
676  cmp_nocase_uh(string, "cubemap") == 0 ||
677  cmp_nocase_uh(string, "cube_map") == 0) {
678  return TT_cube_map;
679 
680  } else {
681  return TT_unspecified;
682  }
683 }
684 
685 /**
686  * Returns the Format value associated with the given string representation,
687  * or F_unspecified if the string does not match any known Format value.
688  */
689 EggTexture::Format EggTexture::
690 string_format(const string &string) {
691  if (cmp_nocase_uh(string, "rgba") == 0) {
692  return F_rgba;
693  } else if (cmp_nocase_uh(string, "rgbm") == 0) {
694  return F_rgbm;
695  } else if (cmp_nocase_uh(string, "rgba12") == 0) {
696  return F_rgba12;
697  } else if (cmp_nocase_uh(string, "rgba8") == 0) {
698  return F_rgba8;
699  } else if (cmp_nocase_uh(string, "rgba4") == 0) {
700  return F_rgba4;
701 
702  } else if (cmp_nocase_uh(string, "rgb") == 0) {
703  return F_rgb;
704  } else if (cmp_nocase_uh(string, "rgb12") == 0) {
705  return F_rgb12;
706  } else if (cmp_nocase_uh(string, "rgb8") == 0) {
707  return F_rgb8;
708  } else if (cmp_nocase_uh(string, "rgb5") == 0) {
709  return F_rgb5;
710  } else if (cmp_nocase_uh(string, "rgba5") == 0) {
711  return F_rgba5;
712  } else if (cmp_nocase_uh(string, "rgb332") == 0) {
713  return F_rgb332;
714  } else if (cmp_nocase_uh(string, "red") == 0) {
715  return F_red;
716  } else if (cmp_nocase_uh(string, "green") == 0) {
717  return F_green;
718  } else if (cmp_nocase_uh(string, "blue") == 0) {
719  return F_blue;
720  } else if (cmp_nocase_uh(string, "alpha") == 0) {
721  return F_alpha;
722  } else if (cmp_nocase_uh(string, "luminance") == 0) {
723  return F_luminance;
724  } else if (cmp_nocase_uh(string, "luminance_alpha") == 0) {
725  return F_luminance_alpha;
726  } else if (cmp_nocase_uh(string, "luminance_alphamask") == 0) {
727  return F_luminance_alphamask;
728  } else {
729  return F_unspecified;
730  }
731 }
732 
733 /**
734  * Returns the CompressionMode value associated with the given string
735  * representation, or CM_default if the string does not match any known
736  * CompressionMode value.
737  */
738 EggTexture::CompressionMode EggTexture::
739 string_compression_mode(const string &string) {
740  if (cmp_nocase_uh(string, "off") == 0) {
741  return CM_off;
742  } else if (cmp_nocase_uh(string, "on") == 0) {
743  return CM_on;
744  } else if (cmp_nocase_uh(string, "fxt1") == 0) {
745  return CM_fxt1;
746  } else if (cmp_nocase_uh(string, "dxt1") == 0) {
747  return CM_dxt1;
748  } else if (cmp_nocase_uh(string, "dxt2") == 0) {
749  return CM_dxt2;
750  } else if (cmp_nocase_uh(string, "dxt3") == 0) {
751  return CM_dxt3;
752  } else if (cmp_nocase_uh(string, "dxt4") == 0) {
753  return CM_dxt4;
754  } else if (cmp_nocase_uh(string, "dxt5") == 0) {
755  return CM_dxt5;
756  } else {
757  return CM_default;
758  }
759 }
760 
761 /**
762  * Returns the WrapMode value associated with the given string representation,
763  * or WM_unspecified if the string does not match any known WrapMode value.
764  */
765 EggTexture::WrapMode EggTexture::
766 string_wrap_mode(const string &string) {
767  if (cmp_nocase_uh(string, "repeat") == 0) {
768  return WM_repeat;
769  } else if (cmp_nocase_uh(string, "clamp") == 0) {
770  return WM_clamp;
771  } else if (cmp_nocase_uh(string, "mirror") == 0) {
772  return WM_mirror;
773  } else if (cmp_nocase_uh(string, "mirror_once") == 0) {
774  return WM_mirror_once;
775  } else if (cmp_nocase_uh(string, "border_color") == 0) {
776  return WM_border_color;
777  } else {
778  return WM_unspecified;
779  }
780 }
781 
782 /**
783  * Returns the FilterType value associated with the given string
784  * representation, or FT_unspecified if the string does not match any known
785  * FilterType value.
786  */
787 EggTexture::FilterType EggTexture::
788 string_filter_type(const string &string) {
789  // Old egg filter types.
790  if (cmp_nocase_uh(string, "point") == 0) {
791  return FT_nearest;
792  } else if (cmp_nocase_uh(string, "linear") == 0) {
793  return FT_linear;
794  } else if (cmp_nocase_uh(string, "bilinear") == 0) {
795  return FT_linear;
796  } else if (cmp_nocase_uh(string, "trilinear") == 0) {
797  return FT_linear_mipmap_linear;
798  } else if (cmp_nocase_uh(string, "mipmap") == 0) {
799  return FT_linear_mipmap_linear;
800  } else if (cmp_nocase_uh(string, "mipmap_point") == 0) {
801  return FT_nearest_mipmap_nearest;
802  } else if (cmp_nocase_uh(string, "mipmap_linear") == 0) {
803  return FT_nearest_mipmap_linear;
804  } else if (cmp_nocase_uh(string, "mipmap_bilinear") == 0) {
805  return FT_linear_mipmap_nearest;
806  } else if (cmp_nocase_uh(string, "mipmap_trilinear") == 0) {
807  return FT_linear_mipmap_linear;
808 
809  // Current egg filter types, that match those in Texture.
810  } else if (cmp_nocase_uh(string, "nearest") == 0) {
811  return FT_nearest;
812  } else if (cmp_nocase_uh(string, "linear") == 0) {
813  return FT_linear;
814  } else if (cmp_nocase_uh(string, "nearest_mipmap_nearest") == 0) {
815  return FT_nearest_mipmap_nearest;
816  } else if (cmp_nocase_uh(string, "linear_mipmap_nearest") == 0) {
817  return FT_linear_mipmap_nearest;
818  } else if (cmp_nocase_uh(string, "nearest_mipmap_linear") == 0) {
819  return FT_nearest_mipmap_linear;
820  } else if (cmp_nocase_uh(string, "linear_mipmap_linear") == 0) {
821  return FT_linear_mipmap_linear;
822 
823  } else {
824  return FT_unspecified;
825  }
826 }
827 
828 /**
829  * Returns the EnvType value associated with the given string representation,
830  * or ET_unspecified if the string does not match any known EnvType value.
831  */
832 EggTexture::EnvType EggTexture::
833 string_env_type(const string &string) {
834  if (cmp_nocase_uh(string, "modulate") == 0) {
835  return ET_modulate;
836 
837  } else if (cmp_nocase_uh(string, "decal") == 0) {
838  return ET_decal;
839 
840  } else if (cmp_nocase_uh(string, "blend") == 0) {
841  return ET_blend;
842 
843  } else if (cmp_nocase_uh(string, "replace") == 0) {
844  return ET_replace;
845 
846  } else if (cmp_nocase_uh(string, "add") == 0) {
847  return ET_add;
848 
849  } else if (cmp_nocase_uh(string, "blend_color_scale") == 0) {
850  return ET_blend_color_scale;
851 
852  } else if (cmp_nocase_uh(string, "modulate_glow") == 0) {
853  return ET_modulate_glow;
854 
855  } else if (cmp_nocase_uh(string, "modulate_gloss") == 0) {
856  return ET_modulate_gloss;
857 
858  } else if (cmp_nocase_uh(string, "normal") == 0) {
859  return ET_normal;
860 
861  } else if (cmp_nocase_uh(string, "normal_height") == 0) {
862  return ET_normal_height;
863 
864  } else if (cmp_nocase_uh(string, "glow") == 0) {
865  return ET_glow;
866 
867  } else if (cmp_nocase_uh(string, "gloss") == 0) {
868  return ET_gloss;
869 
870  } else if (cmp_nocase_uh(string, "height") == 0) {
871  return ET_height;
872 
873  } else if (cmp_nocase_uh(string, "selector") == 0) {
874  return ET_selector;
875 
876  } else if (cmp_nocase_uh(string, "normal_gloss") == 0) {
877  return ET_normal_gloss;
878 
879  } else {
880  return ET_unspecified;
881  }
882 }
883 
884 /**
885  * Returns the CombineMode value associated with the given string
886  * representation, or CM_unspecified if the string does not match any known
887  * CombineMode value.
888  */
889 EggTexture::CombineMode EggTexture::
890 string_combine_mode(const string &string) {
891  if (cmp_nocase_uh(string, "replace") == 0) {
892  return CM_replace;
893 
894  } else if (cmp_nocase_uh(string, "modulate") == 0) {
895  return CM_modulate;
896 
897  } else if (cmp_nocase_uh(string, "add") == 0) {
898  return CM_add;
899 
900  } else if (cmp_nocase_uh(string, "add_signed") == 0) {
901  return CM_add_signed;
902 
903  } else if (cmp_nocase_uh(string, "interpolate") == 0) {
904  return CM_interpolate;
905 
906  } else if (cmp_nocase_uh(string, "subtract") == 0) {
907  return CM_subtract;
908 
909  } else if (cmp_nocase_uh(string, "dot3_rgb") == 0) {
910  return CM_dot3_rgb;
911 
912  } else if (cmp_nocase_uh(string, "dot3_rgba") == 0) {
913  return CM_dot3_rgba;
914 
915  } else {
916  return CM_unspecified;
917  }
918 }
919 
920 /**
921  * Returns the CombineSource value associated with the given string
922  * representation, or CS_unspecified if the string does not match any known
923  * CombineSource value.
924  */
925 EggTexture::CombineSource EggTexture::
926 string_combine_source(const string &string) {
927  if (cmp_nocase_uh(string, "texture") == 0) {
928  return CS_texture;
929 
930  } else if (cmp_nocase_uh(string, "constant") == 0) {
931  return CS_constant;
932 
933  } else if (cmp_nocase_uh(string, "primary_color") == 0) {
934  return CS_primary_color;
935 
936  } else if (cmp_nocase_uh(string, "previous") == 0) {
937  return CS_previous;
938 
939  } else if (cmp_nocase_uh(string, "constant_color_scale") == 0) {
940  return CS_constant_color_scale;
941 
942  } else if (cmp_nocase_uh(string, "last_saved_result") == 0) {
943  return CS_last_saved_result;
944 
945  } else {
946  return CS_unspecified;
947  }
948 }
949 
950 /**
951  * Returns the CombineOperand value associated with the given string
952  * representation, or CO_unspecified if the string does not match any known
953  * CombineOperand value.
954  */
955 EggTexture::CombineOperand EggTexture::
956 string_combine_operand(const string &string) {
957  if (cmp_nocase_uh(string, "src_color") == 0) {
958  return CO_src_color;
959 
960  } else if (cmp_nocase_uh(string, "one_minus_src_color") == 0) {
961  return CO_one_minus_src_color;
962 
963  } else if (cmp_nocase_uh(string, "src_alpha") == 0) {
964  return CO_src_alpha;
965 
966  } else if (cmp_nocase_uh(string, "one_minus_src_alpha") == 0) {
967  return CO_one_minus_src_alpha;
968 
969  } else {
970  return CO_unspecified;
971  }
972 }
973 
974 /**
975  * Returns the TexGen value associated with the given string representation,
976  * or ET_unspecified if the string does not match any known TexGen value.
977  */
978 EggTexture::TexGen EggTexture::
979 string_tex_gen(const string &string) {
980  if (cmp_nocase_uh(string, "unspecified") == 0) {
981  return TG_unspecified;
982 
983  } else if (cmp_nocase_uh(string, "sphere_map") == 0 ||
984  cmp_nocase_uh(string, "eye_sphere_map") == 0) {
985  return TG_eye_sphere_map;
986 
987  } else if (cmp_nocase_uh(string, "world_cube_map") == 0) {
988  return TG_world_cube_map;
989 
990  } else if (cmp_nocase_uh(string, "cube_map") == 0 ||
991  cmp_nocase_uh(string, "eye_cube_map") == 0) {
992  return TG_eye_cube_map;
993 
994  } else if (cmp_nocase_uh(string, "world_normal") == 0) {
995  return TG_world_normal;
996 
997  } else if (cmp_nocase_uh(string, "eye_normal") == 0) {
998  return TG_eye_normal;
999 
1000  } else if (cmp_nocase_uh(string, "world_position") == 0) {
1001  return TG_world_position;
1002 
1003  } else if (cmp_nocase_uh(string, "eye_position") == 0) {
1004  return TG_eye_position;
1005 
1006  } else if (cmp_nocase_uh(string, "point_sprite") == 0) {
1007  return TG_point_sprite;
1008 
1009  } else {
1010  return TG_unspecified;
1011  }
1012 }
1013 
1014 /**
1015  * Returns the TexGen value associated with the given string representation,
1016  * or ET_unspecified if the string does not match any known TexGen value.
1017  */
1018 EggTexture::QualityLevel EggTexture::
1019 string_quality_level(const string &string) {
1020  if (cmp_nocase_uh(string, "unspecified") == 0) {
1021  return QL_unspecified;
1022 
1023  } else if (cmp_nocase_uh(string, "default") == 0) {
1024  return QL_default;
1025 
1026  } else if (cmp_nocase_uh(string, "fastest") == 0) {
1027  return QL_fastest;
1028 
1029  } else if (cmp_nocase_uh(string, "normal") == 0) {
1030  return QL_normal;
1031 
1032  } else if (cmp_nocase_uh(string, "best") == 0) {
1033  return QL_best;
1034 
1035  } else {
1036  return QL_unspecified;
1037  }
1038 }
1039 
1040 /**
1041  * Returns this object cross-cast to an EggTransform pointer, if it inherits
1042  * from EggTransform, or NULL if it does not.
1043  */
1046  return this;
1047 }
1048 
1049 /**
1050  * This function is called within parse_egg(). It should call the appropriate
1051  * function on the lexer to initialize the parser into the state associated
1052  * with this object. If the object cannot be parsed into directly, it should
1053  * return false.
1054  */
1055 bool EggTexture::
1056 egg_start_parse_body() {
1057  egg_start_texture_body();
1058  return true;
1059 }
1060 
1061 /**
1062  * Ensures that our multitexture_sort is at least the indicated value.
1063  */
1064 bool EggTexture::
1065 r_min_multitexture_sort(int sort, EggTexture::MultiTextures &cycle_detector) {
1066  if (_multitexture_sort >= sort) {
1067  // No problem.
1068  return true;
1069  }
1070 
1071  if (!cycle_detector.insert(this).second) {
1072  // Oops, we just hit a cycle!
1073  return false;
1074  }
1075 
1076  _multitexture_sort = sort;
1077 
1078  // Now we also have to increment all of the textures that we are under.
1079  bool no_cycles = true;
1080 
1081  MultiTextures::iterator mti;
1082  for (mti = _under_textures.begin();
1083  mti != _under_textures.end();
1084  ++mti) {
1085  EggTexture *other = (*mti);
1086  if (!other->r_min_multitexture_sort(sort + 1, cycle_detector)) {
1087  // Oops, found a cycle!
1088  no_cycles = false;
1089  }
1090  }
1091 
1092  return no_cycles;
1093 }
1094 
1095 
1096 /**
1097  *
1098  */
1099 ostream &operator << (ostream &out, EggTexture::TextureType texture_type) {
1100  switch (texture_type) {
1101  case EggTexture::TT_unspecified:
1102  return out << "unspecified";
1103 
1104  case EggTexture::TT_1d_texture:
1105  return out << "1d";
1106 
1107  case EggTexture::TT_2d_texture:
1108  return out << "2d";
1109 
1110  case EggTexture::TT_3d_texture:
1111  return out << "3d";
1112 
1113  case EggTexture::TT_cube_map:
1114  return out << "cube-map";
1115  }
1116 
1117  nassertr(false, out);
1118  return out << "(**invalid**)";
1119 }
1120 
1121 
1122 /**
1123  *
1124  */
1125 ostream &operator << (ostream &out, EggTexture::Format format) {
1126  switch (format) {
1127  case EggTexture::F_unspecified:
1128  return out << "unspecified";
1129 
1130  case EggTexture::F_rgba:
1131  return out << "rgba";
1132  case EggTexture::F_rgbm:
1133  return out << "rgbm";
1134  case EggTexture::F_rgba12:
1135  return out << "rgba12";
1136  case EggTexture::F_rgba8:
1137  return out << "rgba8";
1138  case EggTexture::F_rgba4:
1139  return out << "rgba4";
1140 
1141  case EggTexture::F_rgb:
1142  return out << "rgb";
1143  case EggTexture::F_rgb12:
1144  return out << "rgb12";
1145  case EggTexture::F_rgb8:
1146  return out << "rgb8";
1147  case EggTexture::F_rgb5:
1148  return out << "rgb5";
1149  case EggTexture::F_rgba5:
1150  return out << "rgba5";
1151  case EggTexture::F_rgb332:
1152  return out << "rgb332";
1153 
1154  case EggTexture::F_red:
1155  return out << "red";
1156  case EggTexture::F_green:
1157  return out << "green";
1158  case EggTexture::F_blue:
1159  return out << "blue";
1160  case EggTexture::F_alpha:
1161  return out << "alpha";
1162  case EggTexture::F_luminance:
1163  return out << "luminance";
1164  case EggTexture::F_luminance_alpha:
1165  return out << "luminance_alpha";
1166  case EggTexture::F_luminance_alphamask:
1167  return out << "luminance_alphamask";
1168  }
1169 
1170  nassertr(false, out);
1171  return out << "(**invalid**)";
1172 }
1173 
1174 /**
1175  *
1176  */
1177 ostream &operator << (ostream &out, EggTexture::CompressionMode mode) {
1178  switch (mode) {
1179  case EggTexture::CM_default:
1180  return out << "default";
1181  case EggTexture::CM_off:
1182  return out << "off";
1183  case EggTexture::CM_on:
1184  return out << "on";
1185  case EggTexture::CM_fxt1:
1186  return out << "fxt1";
1187  case EggTexture::CM_dxt1:
1188  return out << "dxt1";
1189  case EggTexture::CM_dxt2:
1190  return out << "dxt2";
1191  case EggTexture::CM_dxt3:
1192  return out << "dxt3";
1193  case EggTexture::CM_dxt4:
1194  return out << "dxt4";
1195  case EggTexture::CM_dxt5:
1196  return out << "dxt5";
1197  }
1198 
1199  nassertr(false, out);
1200  return out << "(**invalid**)";
1201 }
1202 
1203 /**
1204  *
1205  */
1206 ostream &operator << (ostream &out, EggTexture::WrapMode mode) {
1207  switch (mode) {
1208  case EggTexture::WM_unspecified:
1209  return out << "unspecified";
1210  case EggTexture::WM_repeat:
1211  return out << "repeat";
1212  case EggTexture::WM_clamp:
1213  return out << "clamp";
1214  case EggTexture::WM_mirror:
1215  return out << "mirror";
1216  case EggTexture::WM_mirror_once:
1217  return out << "mirror_once";
1218  case EggTexture::WM_border_color:
1219  return out << "border_color";
1220  }
1221 
1222  nassertr(false, out);
1223  return out << "(**invalid**)";
1224 }
1225 
1226 /**
1227  *
1228  */
1229 ostream &operator << (ostream &out, EggTexture::FilterType type) {
1230  switch (type) {
1231  case EggTexture::FT_unspecified:
1232  return out << "unspecified";
1233 
1234  case EggTexture::FT_nearest:
1235  return out << "nearest";
1236  case EggTexture::FT_linear:
1237  return out << "linear";
1238 
1239  case EggTexture::FT_nearest_mipmap_nearest:
1240  return out << "nearest_mipmap_nearest";
1241  case EggTexture::FT_linear_mipmap_nearest:
1242  return out << "linear_mipmap_nearest";
1243  case EggTexture::FT_nearest_mipmap_linear:
1244  return out << "nearest_mipmap_linear";
1245  case EggTexture::FT_linear_mipmap_linear:
1246  return out << "linear_mipmap_linear";
1247  }
1248 
1249  nassertr(false, out);
1250  return out << "(**invalid**)";
1251 }
1252 
1253 /**
1254  *
1255  */
1256 ostream &operator << (ostream &out, EggTexture::EnvType type) {
1257  switch (type) {
1258  case EggTexture::ET_unspecified:
1259  return out << "unspecified";
1260 
1261  case EggTexture::ET_modulate:
1262  return out << "modulate";
1263 
1264  case EggTexture::ET_decal:
1265  return out << "decal";
1266 
1267  case EggTexture::ET_blend:
1268  return out << "blend";
1269 
1270  case EggTexture::ET_replace:
1271  return out << "replace";
1272 
1273  case EggTexture::ET_add:
1274  return out << "add";
1275 
1276  case EggTexture::ET_blend_color_scale:
1277  return out << "blend_color_scale";
1278 
1279  case EggTexture::ET_modulate_glow:
1280  return out << "modulate_glow";
1281 
1282  case EggTexture::ET_modulate_gloss:
1283  return out << "modulate_gloss";
1284 
1285  case EggTexture::ET_normal:
1286  return out << "normal";
1287 
1288  case EggTexture::ET_normal_height:
1289  return out << "normal_height";
1290 
1291  case EggTexture::ET_glow:
1292  return out << "glow";
1293 
1294  case EggTexture::ET_gloss:
1295  return out << "gloss";
1296 
1297  case EggTexture::ET_height:
1298  return out << "height";
1299 
1300  case EggTexture::ET_selector:
1301  return out << "selector";
1302 
1303  case EggTexture::ET_normal_gloss:
1304  return out << "normal_gloss";
1305  }
1306 
1307  nassertr(false, out);
1308  return out << "(**invalid**)";
1309 }
1310 
1311 ostream &
1312 operator << (ostream &out, EggTexture::CombineMode cm) {
1313  switch (cm) {
1314  case EggTexture::CM_unspecified:
1315  return out << "unspecified";
1316 
1317  case EggTexture::CM_replace:
1318  return out << "replace";
1319 
1320  case EggTexture::CM_modulate:
1321  return out << "modulate";
1322 
1323  case EggTexture::CM_add:
1324  return out << "add";
1325 
1326  case EggTexture::CM_add_signed:
1327  return out << "add_signed";
1328 
1329  case EggTexture::CM_interpolate:
1330  return out << "interpolate";
1331 
1332  case EggTexture::CM_subtract:
1333  return out << "subtract";
1334 
1335  case EggTexture::CM_dot3_rgb:
1336  return out << "dot3_rgb";
1337 
1338  case EggTexture::CM_dot3_rgba:
1339  return out << "dot3_rgba";
1340  }
1341 
1342  return out << "**invalid CombineMode(" << (int)cm << ")**";
1343 }
1344 
1345 ostream &
1346 operator << (ostream &out, EggTexture::CombineChannel cm) {
1347  switch (cm) {
1348  case EggTexture::CC_rgb:
1349  return out << "rgb";
1350 
1351  case EggTexture::CC_alpha:
1352  return out << "alpha";
1353 
1354  case EggTexture::CC_num_channels:
1355  // This case is here just to prevent a compiler warning. Fall out of the
1356  // switch and return the error message.
1357  break;
1358  }
1359 
1360  return out << "**invalid CombineChannel(" << (int)cm << ")**";
1361 }
1362 
1363 ostream &
1364 operator << (ostream &out, EggTexture::CombineSource cs) {
1365  switch (cs) {
1366  case EggTexture::CS_unspecified:
1367  return out << "unspecified";
1368 
1369  case EggTexture::CS_texture:
1370  return out << "texture";
1371 
1372  case EggTexture::CS_constant:
1373  return out << "constant";
1374 
1375  case EggTexture::CS_primary_color:
1376  return out << "primary_color";
1377 
1378  case EggTexture::CS_previous:
1379  return out << "previous";
1380 
1381  case EggTexture::CS_constant_color_scale:
1382  return out << "constant_color_scale";
1383 
1384  case EggTexture::CS_last_saved_result:
1385  return out << "last_saved_result";
1386  }
1387 
1388  return out << "**invalid CombineSource(" << (int)cs << ")**";
1389 }
1390 
1391 ostream &
1392 operator << (ostream &out, EggTexture::CombineOperand co) {
1393  switch (co) {
1394  case EggTexture::CO_unspecified:
1395  return out << "unspecified";
1396 
1397  case EggTexture::CO_src_color:
1398  return out << "src_color";
1399 
1400  case EggTexture::CO_one_minus_src_color:
1401  return out << "one_minus_src_color";
1402 
1403  case EggTexture::CO_src_alpha:
1404  return out << "src_alpha";
1405 
1406  case EggTexture::CO_one_minus_src_alpha:
1407  return out << "one_minus_src_alpha";
1408  }
1409 
1410  return out << "**invalid CombineOperand(" << (int)co << ")**";
1411 }
1412 
1413 ostream &
1414 operator << (ostream &out, EggTexture::TexGen tex_gen) {
1415  switch (tex_gen) {
1416  case EggTexture::TG_unspecified:
1417  return out << "unspecified";
1418 
1419  case EggTexture::TG_eye_sphere_map:
1420  return out << "eye_sphere_map";
1421 
1422  case EggTexture::TG_world_cube_map:
1423  return out << "world_cube_map";
1424 
1425  case EggTexture::TG_eye_cube_map:
1426  return out << "eye_cube_map";
1427 
1428  case EggTexture::TG_world_normal:
1429  return out << "world_normal";
1430 
1431  case EggTexture::TG_eye_normal:
1432  return out << "eye_normal";
1433 
1434  case EggTexture::TG_world_position:
1435  return out << "world_position";
1436 
1437  case EggTexture::TG_eye_position:
1438  return out << "eye_position";
1439 
1440  case EggTexture::TG_point_sprite:
1441  return out << "point_sprite";
1442  }
1443 
1444  return out << "**invalid TexGen(" << (int)tex_gen << ")**";
1445 }
1446 
1447 ostream &
1448 operator << (ostream &out, EggTexture::QualityLevel quality_level) {
1449  switch (quality_level) {
1450  case EggTexture::QL_unspecified:
1451  return out << "unspecified";
1452  case EggTexture::QL_default:
1453  return out << "default";
1454  case EggTexture::QL_fastest:
1455  return out << "fastest";
1456  case EggTexture::QL_normal:
1457  return out << "normal";
1458  case EggTexture::QL_best:
1459  return out << "best";
1460  }
1461 
1462  return out << "**invalid QualityLevel(" << (int)quality_level << ")**";
1463 }
get_rgb_scale
Returns the rgb_scale value that has been specified for the texture, or 1 if no rgb_scale value has b...
Definition: eggTexture.h:339
get_stage_name
Returns the stage name that has been specified for this texture, or the tref name if no texture stage...
Definition: eggTexture.h:329
get_multiview
Returns the current setting of the multiview flag.
Definition: eggTexture.h:347
std::string get_dirname() const
Returns the directory part of the filename.
Definition: filename.I:358
bool transform_is_identity() const
Returns true if the described transform is identity, false otherwise.
Definition: eggTransform.I:220
const Filename & get_filename() const
Returns a nonmodifiable reference to the filename.
get_alpha_file_channel
Returns the particular channel that has been specified for the alpha-file image, or 0 if no channel h...
Definition: eggTexture.h:346
const LMatrix4d & get_transform3d() const
Returns the overall transform as a 4x4 matrix.
Definition: eggTransform.I:212
void write_header(std::ostream &out, int indent_level, const char *egg_keyword) const
Writes the first line of the egg object, e.g.
has_alpha_scale
Returns true if an alpha_scale has been specified for the texture, false otherwise.
Definition: eggTexture.h:341
get_uv_name
Returns the texcoord name that has been specified for this texture, or the empty string if no texcoor...
Definition: eggTexture.h:337
has_priority
Returns true if a priority value for multitexture importance has been specified for the texture,...
Definition: eggTexture.h:331
bool multitexture_over(EggTexture *other)
Indicates that this texture should be layered on top of the other texture.
Definition: eggTexture.cxx:634
This is an egg node that contains a filename.
get_read_mipmaps
Returns the current setting of the read_mipmaps flag.
Definition: eggTexture.h:350
ostream & enquote_string(ostream &out, const string &str, int indent_level, bool always_quote)
Writes the string to the indicated output stream.
void clear_multitexture()
Resets the multitexture flags set by multitexture_over().
Definition: eggTexture.cxx:597
has_alpha_filename
Returns true if a separate file for the alpha component has been applied, false otherwise.
Definition: eggTexture.h:343
Defines a texture map that may be applied to geometry.
Definition: eggTexture.h:30
std::string get_basename_wo_extension() const
Returns the basename part of the filename, without the file extension.
Definition: filename.I:386
has_border_color
Returns true if a border color has been specified for the texture.
Definition: eggTexture.h:335
get_wrap_u
Returns the amount specified for U wrap.
Definition: eggTexture.h:317
bool affects_polygon_alpha() const
Returns true if this texture's environment type or combine mode allows the texture to have an effect ...
Definition: eggTexture.cxx:541
static QualityLevel string_quality_level(const std::string &string)
Returns the TexGen value associated with the given string representation, or ET_unspecified if the st...
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
void write(std::ostream &out, int indent_level, const std::string &label) const
Writes the transform to the indicated stream in Egg format.
static WrapMode string_wrap_mode(const std::string &string)
Returns the WrapMode value associated with the given string representation, or WM_unspecified if the ...
Definition: eggTexture.cxx:766
virtual EggTransform * as_transform()
Returns this object cross-cast to an EggTransform pointer, if it inherits from EggTransform,...
has_stage_name
Returns true if a stage name has been explicitly specified for this texture, false otherwise.
Definition: eggTexture.h:329
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
has_color
Returns true if a blend color has been specified for the texture.
Definition: eggTexture.h:333
get_anisotropic_degree
Returns the anisotropic filtering degree that has been specified for this texture,...
Definition: eggTexture.h:323
The name of a file, such as a texture file or an Egg file.
Definition: filename.h:39
std::ostream & indent(std::ostream &out, int indent_level)
A handy function for doing text formatting.
Definition: indent.cxx:20
has_anisotropic_degree
Returns true if a value for the anisotropic filtering degree has been specified for this texture,...
Definition: eggTexture.h:323
static Format string_format(const std::string &string)
Returns the Format value associated with the given string representation, or F_unspecified if the str...
Definition: eggTexture.cxx:690
static TextureType string_texture_type(const std::string &string)
Returns the Texture_ype value associated with the given string representation, or TT_unspecified if t...
Definition: eggTexture.cxx:659
static EnvType string_env_type(const std::string &string)
Returns the EnvType value associated with the given string representation, or ET_unspecified if the s...
Definition: eggTexture.cxx:833
has_rgb_scale
Returns true if an rgb_scale has been specified for the texture, false otherwise.
Definition: eggTexture.h:339
static CombineOperand string_combine_operand(const std::string &string)
Returns the CombineOperand value associated with the given string representation, or CO_unspecified i...
Definition: eggTexture.cxx:956
bool sorts_less_than(const EggTexture &other, int eq) const
An ordering operator to compare two textures for sorting order.
Definition: eggTexture.cxx:405
has_alpha_file_channel
Returns true if a particular channel has been specified for the alpha-file image, false otherwise.
Definition: eggTexture.h:346
void write(std::ostream &out, int indent_level) const
Writes the attributes to the indicated output stream in Egg format.
std::string get_extension() const
Returns the file extension.
Definition: filename.I:400
get_alpha_filename
Returns the separate file assigned for the alpha channel.
Definition: eggTexture.h:343
get_wrap_v
Returns the amount specified for V wrap.
Definition: eggTexture.h:318
get_alpha_scale
Returns the alpha_scale value that has been specified for the texture, or 1 if no alpha_scale value h...
Definition: eggTexture.h:341
get_priority
Returns the multitexture importance value that has been specified for the texture,...
Definition: eggTexture.h:331
has_uv_name
Returns true if a texcoord name has been explicitly specified for this texture, false otherwise.
Definition: eggTexture.h:337
get_saved_result
Returns the current setting of the saved_result flag.
Definition: eggTexture.h:325
static TexGen string_tex_gen(const std::string &string)
Returns the TexGen value associated with the given string representation, or ET_unspecified if the st...
Definition: eggTexture.cxx:979
get_multitexture_sort
Returns an integer that represents the depth to which this texture is layered on all other textures i...
Definition: eggTexture.h:358
static FilterType string_filter_type(const std::string &string)
Returns the FilterType value associated with the given string representation, or FT_unspecified if th...
Definition: eggTexture.cxx:788
get_num_views
Returns the specified number of views specified for the 3-D multiview texture.
Definition: eggTexture.h:349
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
bool has_alpha_channel(int num_components) const
Given the number of color components (channels) in the image file as actually read from the disk,...
Definition: eggTexture.cxx:501
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
TypeHandle is the identifier used to differentiate C++ class types.
Definition: typeHandle.h:81
virtual void write(std::ostream &out, int indent_level) const
Writes the texture definition to the indicated output stream in Egg format.
Definition: eggTexture.cxx:125
static CompressionMode string_compression_mode(const std::string &string)
Returns the CompressionMode value associated with the given string representation,...
Definition: eggTexture.cxx:739
bool is_equivalent_to(const EggTexture &other, int eq) const
Returns true if the two textures are equivalent in all relevant properties (according to eq),...
Definition: eggTexture.cxx:329
static CombineMode string_combine_mode(const std::string &string)
Returns the CombineMode value associated with the given string representation, or CM_unspecified if t...
Definition: eggTexture.cxx:890
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
static CombineSource string_combine_source(const std::string &string)
Returns the CombineSource value associated with the given string representation, or CS_unspecified if...
Definition: eggTexture.cxx:926
get_wrap_w
Returns the amount specified for W wrap.
Definition: eggTexture.h:319
has_num_views
Returns true if the number of views has been specified for the 3-D multiview texture,...
Definition: eggTexture.h:349
This represents the <Transform> entry of a group or texture node: a list of component transform opera...
Definition: eggTransform.h:29
bool has_transform() const
Returns true if the transform is nonempty, false if it is empty (no transform components have been ad...
Definition: eggTransform.I:143